星盘对象
Astrolabe 的字段、定位方法与三方四正判断。
Astrolabe 是排盘的产物,也是一切查询的入口。它持有十二宫的全部数据,
以及四柱、命主身主、五行局这些盘级信息。
chart, _ := iztro.BySolar("2000-8-16", 2, iztro.GenderFemale, true, iztro.LanguageZhCN, nil)本页示例统一用 "zh-CN" 排盘,因此输出里的展示值都是中文。
换语言只改这些展示串,*Key 标识与所有判断方法的结果不变。
字段
Palace / PalaceByIndex
用途 按宫名、身宫、来因宫或索引取一宫。
斗数含义 十二宫是斗数的骨架。命宫定下后,其余十一宫按固定顺序逆时针排开。 「身宫」是十二宫之一同时被标记的那一宫,代表后天着力处; 「来因宫」是宫干与生年干相同的那一宫,代表事情的起因。
签名
func (a *Astrolabe) Palace(nameKeyOrName string) *Palace
func (a *Astrolabe) PalaceByIndex(index int) *Palace参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
nameKeyOrName | string | 是 | — | 宫名标识、"bodyPalace"、"originalPalace",或宫名译名 |
index | int | 是 | — | 宫位索引 0–11,0 为寅宫 |
返回值 *Palace。名字拼错或索引越界时返回 nil;
"soulPalace" 一类宫名、"bodyPalace"、"originalPalace" 只要拼对,
在任何一张盘上都定位得到。
示例
soul := chart.Palace(iztro.PalaceSoul)
fmt.Println(soul.Name, soul.HeavenlyStem+soul.EarthlyBranch)
fmt.Println("身宫:", chart.Palace("bodyPalace").Name)
fmt.Println("来因:", chart.Palace("originalPalace").Name)
fmt.Println("寅宫:", chart.PalaceByIndex(0).Name)输出
命宫 壬午
身宫: 官禄
来因: 夫妻
寅宫: 财帛边界与陷阱
Star
用途 按标识找到一颗星,并同时取回它所在的宫。
签名
func (a *Astrolabe) Star(keyOrName string) (*Star, *Palace)参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
keyOrName | string | 是 | — | 星耀标识或译名 |
返回值 (*Star, *Palace)。该星不在这张盘上时两者都为 nil。
示例
ziwei, palace := chart.Star(iztro.StarZiweiMaj)
fmt.Println(ziwei.Name, "在", palace.Name)
fmt.Println("对宫是", ziwei.OppositePalace().Name)
fmt.Println("亮度", ziwei.Brightness, "四化", ziwei.Mutagen)输出
紫微 在 命宫
对宫是 迁移
亮度 庙 四化四化为空串表示这颗星没有生年四化。
边界与陷阱
只在主星、辅星、杂耀三组里查找。长生十二神、博士十二神、岁前与将前十二神
是每宫一个的标记而非星耀列表,用 palace.Changsheng12Key 一类字段直接取。
SurroundedPalaces / SurroundedPalacesByIndex
用途 取目标宫的三方四正。
斗数含义 三方四正是斗数最常用的取象范围:本宫、对宫(本宫 +6)、 官禄位(本宫 +4)、财帛位(本宫 +8)。四个宫合起来看,而不只看本宫, 是因为对宫与三合宫的星耀同样作用于本宫的事。
签名
func (a *Astrolabe) SurroundedPalaces(nameKeyOrName string) *SurroundedPalaces
func (a *Astrolabe) SurroundedPalacesByIndex(index int) *SurroundedPalaces返回值 *SurroundedPalaces,含 Target / Opposite / Wealth / Career 四个 *Palace。
SurroundedPalaces 在名字拼错时返回 nil;SurroundedPalacesByIndex 对索引取模,
因此负数与超过 11 的索引都能正确回绕,只有零值星盘(不足十二宫)才返回 nil。
判断方法见三方四正。
示例
sp := chart.SurroundedPalaces(iztro.PalaceSoul)
fmt.Println(sp.Target.Name, sp.Opposite.Name, sp.Wealth.Name, sp.Career.Name)
fmt.Println("三方四正见紫微:", sp.Have(iztro.StarZiweiMaj))输出
命宫 迁移 财帛 官禄
三方四正见紫微: trueIsSurrounded / IsSurroundedOneOf / NotSurrounded
用途 直接在星盘上判断某宫的三方四正里有没有指定星耀,省去先取三方四正的一步。
签名
func (a *Astrolabe) IsSurrounded(nameKeyOrName string, stars ...string) bool
func (a *Astrolabe) IsSurroundedOneOf(nameKeyOrName string, stars ...string) bool
func (a *Astrolabe) NotSurrounded(nameKeyOrName string, stars ...string) bool参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
nameKeyOrName | string | 是 | — | 宫名标识或译名 |
stars | ...string | 是 | — | 星耀标识,可变参数 |
返回值
| 方法 | 语义 |
|---|---|
IsSurrounded | 列出的每一颗都在三方四正里 |
IsSurroundedOneOf | 列出的至少一颗在三方四正里 |
NotSurrounded | 列出的一颗都不在三方四正里 |
示例
fmt.Println(chart.IsSurrounded(iztro.PalaceSoul, iztro.StarZiweiMaj, iztro.StarTianxiangMaj))
fmt.Println(chart.IsSurroundedOneOf(iztro.PalaceSoul, iztro.StarQishaMaj, iztro.StarPojunMaj))
fmt.Println(chart.NotSurrounded(iztro.PalaceSoul, iztro.StarHuoxingMin))输出
true
false
true命宫只坐紫微,天相在三方之一的财帛宫,因此第一行为真; 七杀与破军都不在这四宫内,第二行为假。
边界与陷阱
不传星耀时的返回值
一颗星都不传时,IsSurrounded 与 NotSurrounded 返回 true
(「所有元素都满足」与「没有元素不满足」对空集都成立),
IsSurroundedOneOf 返回 false。
Horoscope / HoroscopeNow
用途 以本盘为起点计算目标日期的运限。
签名
func (a *Astrolabe) Horoscope(targetDate string, targetTimeIndex uint8) (*Horoscope, error)
func (a *Astrolabe) HoroscopeNow() (*Horoscope, error)参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
targetDate | string | 是 | — | 目标公历日期,格式 YYYY-M-D |
targetTimeIndex | uint8 | 是 | — | 目标时辰索引 0–12,决定流时 |
HoroscopeNow 取本地时钟的当前日期与当前时辰,无参数。
返回值 *Horoscope——持有本盘的运限对象,六个层级的宫位查询不必再传星盘。
详见运限对象。
示例
h, _ := chart.Horoscope("2025-6-1", 0)
fmt.Println("大限", h.Decadal.HeavenlyStem+h.Decadal.EarthlyBranch)
fmt.Println("流年", h.Yearly.HeavenlyStem+h.Yearly.EarthlyBranch)输出
大限 庚辰
流年 乙巳与 JSON 的关系
Astrolabe 及其下的所有类型都带 json 标签,标签名与 JS iztro 的字段契约一致。
因此 json.Marshal(chart) 直接就是可以交给前端或别的进程的 DTO:
b, err := json.Marshal(chart)
if err != nil {
log.Fatal(err)
}
var v map[string]any
_ = json.Unmarshal(b, &v)
fmt.Println(v["solarDate"], v["genderKey"], v["timeIndex"])
fmt.Println(v["palaces"].([]any)[4].(map[string]any)["nameKey"])输出
2000-8-16 female 2
soulPalaceConfig 里的自定义四化与亮度表不进 JSON——它们是排盘输入而非结果,
回显会破坏与 JS iztro 的字段契约。