# 轻量查询 (/zh/docs/go/query)

不排整盘就能拿到的生肖、星座与命宫主星。



有些问题不需要整张星盘。这五个函数各自只跑到必要的那一步就返回，
结果与完整排盘的对应字段永远一致——它们走的是同一套核心逻辑。

<Callout type="info">
  本页示例统一用 `"zh-CN"` 排盘，因此输出里的展示值都是中文。
</Callout>

***

## GetZodiacBySolarDate [#getzodiacbysolardate]

**用途**　由公历日期取生肖。

**斗数含义**　生肖由**年支**决定，而年支的换算时点受 `YearDivide` 影响。
正月初一与立春之间出生的人，两种配置会得到不同的生肖——这不是缺陷，是流派差异。

**签名**

```go
func GetZodiacBySolarDate(solarDate string, language Language, config *Config) (string, error)
```

**参数**

| 参数          | 类型         | 必填 | 默认 | 说明                              |
| ----------- | ---------- | -- | -- | ------------------------------- |
| `solarDate` | `string`   | 是  | —  | 公历日期，格式 `YYYY-M-D`              |
| `language`  | `Language` | 是  | —  | 盘面语言                            |
| `config`    | `*Config`  | 是  | —  | 传 `nil` 取默认；仅 `YearDivide` 影响结果 |

**返回值**　按语言翻译的生肖名。

**示例**

```go
zodiac, _ := iztro.GetZodiacBySolarDate("2000-8-16", iztro.LanguageZhCN, nil)
fmt.Println(zodiac)
```

**输出**

```text
龙
```

**边界与陷阱**

<Callout type="warn" title="跨年边界会随配置改变">
  默认按正月初一换年。改成 `&Config{YearDivide: iztro.YearDivideExact}` 后按立春换年，
  1 月下旬到 2 月上旬出生的人可能拿到不同生肖。
</Callout>

***

## GetSignBySolarDate / GetSignByLunarDate [#getsignbysolardate--getsignbylunardate]

**用途**　取星座。

**斗数含义**　星座是西洋占星概念，只由公历日期决定，与斗数算法无关。
农历版本先把农历转成公历再判定，因此两者对同一天的结果相同。

**签名**

```go
func GetSignBySolarDate(solarDate string, language Language) (string, error)
func GetSignByLunarDate(lunarDate string, isLeapMonth bool, language Language) (string, error)
```

**参数**

| 参数                        | 类型         | 必填 | 默认 | 说明               |
| ------------------------- | ---------- | -- | -- | ---------------- |
| `solarDate` / `lunarDate` | `string`   | 是  | —  | 日期，格式 `YYYY-M-D` |
| `isLeapMonth`             | `bool`     | 是  | —  | 仅农历版本：该月是否闰月     |
| `language`                | `Language` | 是  | —  | 盘面语言             |

无 `config` 参数——星座不受任何配置影响。

**返回值**　星座名。

**示例**

```go
s1, _ := iztro.GetSignBySolarDate("2000-8-16", iztro.LanguageZhCN)
s2, _ := iztro.GetSignByLunarDate("2000-7-17", false, iztro.LanguageZhCN)

fmt.Println(s1, s2)
```

**输出**

```text
狮子座 狮子座
```

***

## GetMajorStarBySolarDate / GetMajorStarByLunarDate [#getmajorstarbysolardate--getmajorstarbylunardate]

**用途**　只取命宫主星，不排整盘。

**斗数含义**　命宫主星是斗数最常被单独问起的一项。
命宫为空宫时按惯例借对宫主星来看，本函数已经处理了这一步。

**签名**

```go
func GetMajorStarBySolarDate(
    solarDate string, timeIndex uint8, fixLeap bool, language Language, config *Config,
) (string, error)

func GetMajorStarByLunarDate(
    lunarDate string, timeIndex uint8, leap LeapMonth, language Language, config *Config,
) (string, error)
```

**参数**

| 参数                        | 类型          | 必填 | 默认 | 说明                                                                                                 |
| ------------------------- | ----------- | -- | -- | -------------------------------------------------------------------------------------------------- |
| `solarDate` / `lunarDate` | `string`    | 是  | —  | 日期                                                                                                 |
| `timeIndex`               | `uint8`     | 是  | —  | 时辰索引 0–12，命宫由月份与时辰共同决定                                                                             |
| `fixLeap`                 | `bool`      | 是  | —  | 仅阳历版本：阳历日期落在闰月十五之后时是否视作次月                                                                          |
| `leap`                    | `LeapMonth` | 是  | —  | 仅农历版本：`NotLeapMonth` / `LeapMonthKeep` / `LeapMonthFixed`，见 [`ByLunar`](/zh/docs/go/astro#bylunar) |
| `language`                | `Language`  | 是  | —  | 盘面语言                                                                                               |
| `config`                  | `*Config`   | 是  | —  | 传 `nil` 取默认                                                                                        |

**返回值**　多颗主星以逗号分隔；空宫时返回对宫主星。

**示例**

```go
zh, _ := iztro.GetMajorStarBySolarDate("2000-8-16", 2, true, iztro.LanguageZhCN, nil)
en, _ := iztro.GetMajorStarBySolarDate("2000-8-16", 2, true, iztro.LanguageEnUS, nil)

fmt.Println(zh, en)
```

**输出**

```text
紫微 emperor
```

**边界与陷阱**

<Accordions>
  <Accordion title="不传时辰拿不到命宫">
    命宫由农历月份与出生时辰共同定位，因此 `timeIndex` 是必填的。
    只知道日期不知道时辰时，斗数无法给出确定的命宫。
  </Accordion>

  <Accordion title="要判断请用 key 形态">
    返回值是翻译后的字符串，换语言就会变。要做程序判断用下面的
    `MajorStarKeysBySolarDate` / `MajorStarKeysByLunarDate`，
    或排整盘后比较 `MajorStars` 里的 `Key`。
  </Accordion>
</Accordions>

***

## MajorStarKeysBySolarDate / MajorStarKeysByLunarDate [#majorstarkeysbysolardate--majorstarkeysbylunardate]

**用途**　命宫主星的语言无关标识列表——上面两个函数的 key 形态，供程序判断。

**签名**

```go
func MajorStarKeysBySolarDate(
    solarDate string, timeIndex uint8, fixLeap bool, config *Config,
) ([]string, error)

func MajorStarKeysByLunarDate(
    lunarDate string, timeIndex uint8, leap LeapMonth, config *Config,
) ([]string, error)
```

**返回值**　`[]string`——星耀标识常量取值（如 `StarZiweiMaj`）；
命宫为空宫时同样借对宫主星。标识与输出语言无关，因此&#x2A;*不收 `language`**。

**示例**

```go
keys, _ := iztro.MajorStarKeysBySolarDate("2000-8-16", 2, true, nil)

fmt.Println(keys)
```

**输出**

```text
[ziweiMaj]
```
