星盘对象
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。
FlankingPalaces
用途 取目标宫的夹宫:盘上紧邻它前后的两宫。
斗数含义 「羊陀夹忌」「日月夹命」这类说法看的就是夹宫。 夹宫与三方四正是两条不重叠的线索:三方四正问的是同一组能量彼此呼应, 夹宫问的是这一宫左右两侧的处境。
签名
func (a *Astrolabe) FlankingPalaces(target PalaceTarget) (*FlankingPalaces, error)
func (a *Astrolabe) FlankingPalacesContext(ctx context.Context, target PalaceTarget) (*FlankingPalaces, error)参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
target | PalaceTarget | 是 | — | Key 非空时按宫名标识定位(另接受 PalaceBody / PalaceOriginal),否则按 Index 取宫 |
返回值 *FlankingPalaces,两个 *Palace 字段:
| 字段 | 相对目标宫 | 说明 |
|---|---|---|
Previous | -1 | 前一宫 |
Next | +1 | 后一宫 |
十二宫首尾相连,索引对 12 回绕:第 0 宫的前一宫是第 11 宫。
两个字段都是本盘上的宫位,Palace 的飞化、三方四正等关系查询照常可用。
五个判断方法与三方四正同名同义,只是作用范围换成这两宫:
| 方法 | 语义 |
|---|---|
Have(stars ...string) bool | 两宫合起来含列表中每一颗 |
NotHave(stars ...string) bool | 两宫一颗都不含 |
HaveOneOf(stars ...string) bool | 两宫合起来至少含一颗 |
HaveMutagen(mutagenKey string) bool | 两宫中有任一宫带该生年四化 |
NotHaveMutagen(mutagenKey string) bool | 两宫都不带 |
星耀是可变参数,既可以写 StarZiweiMaj 这些常量,也可以写当前语言的星名。
示例
f, _ := chart.FlankingPalaces(iztro.PalaceTarget{Key: iztro.PalaceSoul})
fmt.Println(f.Previous.Name, "/", f.Next.Name)
fmt.Println(f.Have(iztro.StarTianjiMaj, iztro.StarTuoluoMin))
fmt.Println(f.HaveOneOf(iztro.StarHuoxingMin))
w, _ := chart.FlankingPalaces(iztro.PalaceTarget{Key: iztro.PalaceWealth})
fmt.Println(w.Previous.Name, "/", w.Next.Name)
fmt.Println(w.HaveMutagen(iztro.MutagenLu), w.HaveMutagen(iztro.MutagenJi))输出
兄弟 / 父母
true
false
疾厄 / 子女
true true命宫在午,夹它的是兄弟(巳)与父母(未)。天机坐兄弟、陀罗坐父母,分处两宫,
Have 仍然成立;火星坐夫妻,不在这两宫之内,因此 HaveOneOf 为 false。
财帛在寅,夹它的疾厄坐天同、子女坐太阳,这张盘生年干庚使太阳化禄、天同化忌,
于是禄与忌两问都为 true。
边界与陷阱
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)输出
大限 庚辰
流年 乙巳ToText / PalaceToText / SurroundedPalacesToText
用途 星盘、单宫或三方四正的语义化文本:面向语言模型与人的完整描述。
签名
func (a *Astrolabe) ToText() (string, error)
func (a *Astrolabe) PalaceToText(target PalaceTarget) (string, error)
func (a *Astrolabe) SurroundedPalacesToText(target PalaceTarget) (string, error)各有 Context 变体。PalaceTarget 的 Key 非空时按宫名标识定位
(PalaceSoul 等常量,另接受 PalaceBody / PalaceOriginal),
否则按 Index(0–11)取宫。按排盘语言输出,
完整格式见语义化文本。
示例
text, _ := chart.PalaceToText(iztro.PalaceTarget{Key: iztro.PalaceSoul})
fmt.Println(strings.Split(text, "\n")[0])输出
### 命宫 (壬午) · 大限 3-12单宫文本就是本命文本「十二宫」节里该宫的段落;三方四正文本以 ## 命宫 三方四正 起,
下接本宫、对宫、财帛位、官禄位四段,每段标题带角色前缀(### 本宫 · 命宫 (壬午) · 大限 3-12),事实行与单宫文本一致。格局文本见 PatternsToText(格局判定)。
ToTextWith / PalaceToTextWith / SurroundedPalacesToTextWith
用途 对应 ToText 的文本,按 opts 带上知识包里的释义:每宫事实行之后紧跟该宫星耀的释义
(**星名(亮度)化X**: 正文,同宫主星的组合解读 **A × B (同宫)**: 放最前;十二神不释义),
格局列表之后紧跟格局释义(含 成立条件: 段),本命文本末尾另有 ## 四化释义。
签名
func (a *Astrolabe) ToTextWith(opts TextOptions) (string, error)
func (a *Astrolabe) PalaceToTextWith(target PalaceTarget, opts TextOptions) (string, error)
func (a *Astrolabe) SurroundedPalacesToTextWith(target PalaceTarget, opts TextOptions) (string, error)参数
| 参数 | 类型 | 说明 |
|---|---|---|
target | PalaceTarget | 同 PalaceToText |
opts | TextOptions | 输出选项。Knowledge 字段给释义材料来源:BuiltinKnowledge() 取盘语言的内嵌默认包,KnowledgeFrom(pack) 用给定的包;PatternConfig 字段给格局判定口径,同时作用于格局节与格局释义;零值 TextOptions{} 等同不带 With 的方法 |
各有 Context 变体。释义的插入位置与去重规则见带释义的文本。
示例
plain, _ := chart.ToText()
text, _ := chart.ToTextWith(iztro.TextOptions{Knowledge: iztro.BuiltinKnowledge()})
fmt.Println(utf8.RuneCountInString(plain), utf8.RuneCountInString(text))
var heads []string
for _, l := range strings.Split(text, "\n") {
if strings.HasPrefix(l, "## ") {
heads = append(heads, l)
}
}
fmt.Println(strings.Join(heads, " "))输出
3389 20767
## 基本信息 ## 十二宫总览 ## 格局 ## 十二宫 ## 四化释义两份文本的 ## 节只差末尾的「四化释义」:释义不另起节,而是插在各宫与格局之后。
边界与陷阱
BuiltinKnowledge() 用在没有内嵌包的语言(目前只有 zh-CN 有)的盘上返回 ErrInvalidArgument,
不会静默退回无释义;英文盘用 KnowledgeFrom(pack) 显式给包。
与 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 的字段契约。