运限对象

六个运限层级的数据结构、整层取回的三个列表,以及不必再传星盘的宫位查询方法。

运限把本命盘投影到某个时间点上。同一张盘,不同年份看到的宫位分布不同—— 这正是「大限走到哪一宫」的意思。

h, _ := chart.Horoscope("2025-6-1", 0)

Horoscope 持有发起它的那张本命盘,因此所有查询方法都不必再把星盘传进去。

本页示例统一用 "zh-CN" 的本命盘,因此输出里的展示值都是中文。

字段

字段类型跨度说明
SolarDate / LunarDatestring—目标日期的公历串与农历中文写法。出生日期在本命盘上,用 h.Astrolabe().SolarDate 取
DecadalHoroscopeScope十年大限。未起运的幼年期为童限
AgeHoroscopeScope一年小限。按虚岁逐年走一宫
YearlyHoroscopeScope一年流年。按流年干支定宫
MonthlyHoroscopeScope一月流月
DailyHoroscopeScope一日流日
HourlyHoroscopeScope一时辰流时

小限与流年的区别

两者都是一年一走,但起法不同:小限从生年地支起、按虚岁顺推, 流年直接看那一年的干支落在哪一宫。两条线互相独立,斗数里通常并看。

HoroscopeScope

字段类型说明
Indexint该层级落在哪一宫(宫位索引)
Namestring层级显示名,按输出语言翻译
NameKeystring层级标识:decadal / childhood(童限,未起运)/ turn(小限)/ yearly / monthly / daily / hourly。判断层级用它,不要比对译文
HeavenlyStem / HeavenlyStemKeystring该层级的天干,决定它飞出的四化
EarthlyBranch / EarthlyBranchKeystring该层级的地支
PalaceNames / PalaceNameKeys[]string以该层级所在宫为命宫重推的十二宫名,按宫位索引排列
Mutagen / MutagenStarKeys[]string该层级天干引发的四化星,顺序为禄权科忌;MutagenStarKeys 是被化四星的星耀标识,与宫位的同名字段同义
Stars[][]Star该层级的流耀分布;无流耀的层级为 nil
NominalAgeint仅小限:虚岁。其余层级为 0
YearlyDecStar*YearlyDecStar仅流年:岁前与将前十二神。其余层级为 nil
type YearlyDecStar struct {
    Suiqian12       []string `json:"suiqian12"`        // 岁前十二神译名,按宫位索引排列
    Suiqian12Keys   []string `json:"suiqian12Keys"`    // 对应标识
    Jiangqian12     []string `json:"jiangqian12"`      // 将前十二神译名
    Jiangqian12Keys []string `json:"jiangqian12Keys"`  // 对应标识
}

六个层级共用一个类型

Go 侧不为小限与流年各开一个类型,而是把 NominalAge 与 YearlyDecStar 放进共用的 HoroscopeScope——其余层级上这两项为零值。 调用处因此可以写按层级参数化的通用逻辑。

YearlyDecStar 是指针,非流年层级为 nil

h.Decadal.YearlyDecStar 是 nil,直接取字段会 panic。 只有 h.Yearly.YearlyDecStar 非空——按层级遍历时先判空。

h, _ := chart.Horoscope("2025-6-1", 0)

fmt.Println(h.Decadal.YearlyDecStar == nil, h.Yearly.YearlyDecStar != nil)
fmt.Println(h.Yearly.YearlyDecStar.Suiqian12[:3])
fmt.Println(h.Yearly.YearlyDecStar.Jiangqian12Keys[:3])
fmt.Println(h.Decadal.NominalAge, h.Age.NominalAge)

输出

true true
[天德 吊客 病符]
[jiesha zhaisha tiansha]
0 26

PalaceIndexByName

func (item *HoroscopeScope) PalaceIndexByName(nameKeyOrName string) int

在该层级重排后的十二宫里,按宫名标识或当前语言宫名查宫位索引;找不到返回 -1。

h, _ := chart.Horoscope("2025-6-1", 0)

fmt.Println(h.Decadal.PalaceIndexByName(iztro.PalaceSoul))
fmt.Println(h.Decadal.PalaceIndexByName(iztro.PalaceWealth))
fmt.Println(h.Decadal.PalaceIndexByName("nosuch"))

输出

2
10
-1

返回 -1 而不是 0——0 是合法的宫位索引(寅宫)。 拿它去索引 chart.Palaces 前务必判负。

示例

h, _ := chart.Horoscope("2025-6-1", 0)

for _, item := range []iztro.HoroscopeScope{h.Decadal, h.Monthly, h.Daily, h.Hourly} {
    fmt.Printf("%s 落在宫位 %d 干支 %s%s\n",
        item.Name, item.Index, item.HeavenlyStem, item.EarthlyBranch)
}

fmt.Println("小限虚岁", h.Age.NominalAge)
fmt.Println("大限四化", h.Decadal.Mutagen)
fmt.Println("流年岁前十二神", h.Yearly.YearlyDecStar.Suiqian12[:3])

输出

大限 落在宫位 2 干支 庚辰
流月 落在宫位 3 干支 壬午
流日 落在宫位 8 干支 辛丑
流时 落在宫位 8 干支 戊子
小限虚岁 26
大限四化 [太阳 武曲 太阴 天同]
流年岁前十二神 [天德 吊客 病符]

三个列表

DecadalList / YearlyList / MonthlyList 是 *Astrolabe 上的方法,不在运限对象上: 它们一次取回整层的运限项,省去按日期逐个调 Horoscope 再自己拼。 三种列表项都内嵌 HoroscopeScope,通用字段直接访问,各自多带该层的时间坐标:

类型多出的字段说明
DecadalListItemPalaceName / PalaceNameKey: string该大限所在的本命宫名
AgeRange: [2]int起止虚岁,含两端
YearRange: [2]int起止农历年份,含两端
YearlyListItemAge: int该流年对应的虚岁
Year: int农历年份
MonthlyListItemAge: int该流月对应的虚岁
Year: int农历年份
Month: int农历月份,正月为 1;闰月与同号常规月的 Month 相同
IsLeapMonth: bool该项是否闰月
Part: string分段标识,取 MonthPart* 常量
DayRange: [2]int该段覆盖的农历日,含两端

MonthPart* 三个常量:MonthPartNormal 整月一段、MonthPartFirst 闰月前半、 MonthPartSecond 闰月后半。

三个方法都各有一个 *Context 变体,ctx 用于取消等待 wasm 实例。

列表里的运限按时柱地支起

三个列表的每一项都以时柱地支对应的时辰计算,而不是排盘时传入的时辰索引。 两者只在晚子时不同:入参 12 的盘,时柱地支是子,列表按时辰 0 起运限。


DecadalList

用途 一次取回本盘十二个大限,按起运先后排列。

斗数含义 大限十年一步,从起限宫顺逆行走十二宫。 把整条线摊平看,才知道某一段人生落在哪一宫、对应哪十年。

签名

func (a *Astrolabe) DecadalList() ([]DecadalListItem, error)
func (a *Astrolabe) DecadalListContext(ctx context.Context) ([]DecadalListItem, error)

返回值 定长 12 项,第 0 项是第一个大限。顺序按起运虚岁排, 与宫位索引顺序无关(大限顺行逆行取决于阴阳男女)。

示例

dl, _ := chart.DecadalList()

for _, d := range dl[:3] {
    fmt.Println(d.PalaceName, d.HeavenlyStem, d.EarthlyBranch, d.AgeRange, d.YearRange)
}
fmt.Println(len(dl))

输出

命宫 壬 午 [3 12] [2002 2011]
兄弟 辛 巳 [13 22] [2012 2021]
夫妻 庚 辰 [23 32] [2022 2031]
12

这张盘三岁起运,第一个大限落在命宫。

边界与陷阱

列表里没有童限

起运之前的那几年是童限,只有按具体日期查 Horoscope 才会出现(NameKey 为 childhood)。 DecadalList 列的是十二个大限本身,每项的 NameKey 恒为 decadal。


YearlyList / YearlyListByPalace

用途 取一个大限内的全部流年。

斗数含义 定了大限再逐年细看,是斗数常规的推运顺序。 一个大限十年,对应的就是这十个流年。

签名

func (a *Astrolabe) YearlyList(ordinal int) ([]YearlyListItem, error)
func (a *Astrolabe) YearlyListByPalace(nameKey string) ([]YearlyListItem, error)

两者各有一个 *Context 变体。

参数

方法参数类型说明
YearlyListordinalint大限序号,0 为第一个大限;越界返回错误
YearlyListByPalacenameKeystring该大限所在的本命宫名标识(PalaceSoul 等常量);空串或未知标识返回错误

两种写法定位到同一个大限时结果完全相同,选哪个取决于手上已有什么。

返回值 10 项,按虚岁先后排列。

示例

years, _ := chart.YearlyList(2)

for _, y := range years[:3] {
    fmt.Println(y.Age, y.Year, y.HeavenlyStem, y.EarthlyBranch, "->", y.Index)
}

byPalace, _ := chart.YearlyListByPalace(iztro.PalaceSpouse)
fmt.Println(len(years), len(byPalace))

输出

23 2022 壬 寅 -> 0
24 2023 癸 卯 -> 1
25 2024 甲 辰 -> 2
10 10

第 2 个大限落在夫妻宫,因此这两次调用问的是同一个大限。

边界与陷阱

没有默认大限

YearlyListByPalace("") 返回错误而不是退回某个默认大限——静默取一个默认值会把漏传 变成看起来成功的错答案。


MonthlyList

用途 取一个农历年的全部流月。

斗数含义 流月是流年之下的一层,逐月推移。闰月怎么算是一个流派分歧点, 因此拆不拆由调用方定。

签名

func (a *Astrolabe) MonthlyList(lunarYear int, fixLeap *bool) ([]MonthlyListItem, error)
func (a *Astrolabe) MonthlyListContext(ctx context.Context, lunarYear int, fixLeap *bool) ([]MonthlyListItem, error)

参数

参数类型必填默认说明
lunarYearint是—农历年份
fixLeap*bool是nil 即内核默认(真)闰月是否拆成前后半月两项;用 iztro.Bool(false) 关掉

返回值 长度取决于该年有无闰月与 fixLeap:

该农历年fixLeap项数闰月怎么排
无闰月任意12—
有闰月nil 或 Bool(true)14闰月拆成 MonthPartFirst(初一至十五)与 MonthPartSecond(十六至月末)两项
有闰月Bool(false)13闰月整月一项,Part 为 MonthPartNormal

闰月排在同月号的常规月之后。每项按该段首日算出(后半段取十六)。

示例

months, _ := chart.MonthlyList(2020, nil)

fmt.Println(len(months))
for _, m := range months[3:7] {
    fmt.Println(m.Month, m.IsLeapMonth, m.Part, m.DayRange, m.HeavenlyStem, m.EarthlyBranch)
}

whole, _ := chart.MonthlyList(2020, iztro.Bool(false))
plain, _ := chart.MonthlyList(2021, nil)
fmt.Println(len(whole), len(plain))

输出

14
4 false normal [1 30] 辛 巳
4 true first [1 15] 辛 巳
4 true second [16 29] 壬 午
5 false normal [1 30] 壬 午
13 12

农历 2020 年有闰四月。拆开之后,闰四月前半与四月同干支(辛巳),后半跟五月同干支(壬午) ——这正是「闰月下半月算下一个月」的意思。农历 2021 年无闰月,恒为 12 项。

边界与陷阱

这个 fixLeap 与排盘的 fixLeap 无关

排盘入口那个 fixLeap 决定闰月出生的人下半月按下个月安星,改的是本命盘布局; 这里这个只决定本列表拆不拆闰月。两者可以取不同的值,互不影响。

闰月与常规月的 Month 相同

闰四月的 Month 也是 4,靠 IsLeapMonth 区分。按 Month 去重会把闰月弄丢。


AgePalace

用途 取小限当年所在的宫。

斗数含义 小限是逐年推移的一条线,落在哪一宫就以那宫为该年重点。

签名

func (h *Horoscope) AgePalace() *Palace

返回值 *Palace——本命盘上的宫位。

示例

h, _ := chart.Horoscope("2025-6-1", 0)
fmt.Println(h.AgePalace().Name)

输出

田宅

Palace

用途 取某个运限层级下、按该层级重推的十二宫中的某一宫。

斗数含义 大限走到某宫后,以那一宫为「大限命宫」重排十二宫。 「大限的夫妻宫」问的就是这套重排后的宫位,与本命夫妻宫通常不是同一宫。

签名

func (h *Horoscope) Palace(nameKeyOrName string, scope string) *Palace

参数

参数类型必填默认说明
nameKeyOrNamestring是—要取的宫名标识或译名
scopestring是—在哪个层级的十二宫里找

返回值 *Palace——本命盘上的宫位(同一格宫位在不同层级有不同宫名)。 层级为 ScopeOrigin 时即本命十二宫。查不到返回 nil。

示例

h, _ := chart.Horoscope("2025-6-1", 0)

fmt.Println("大限命宫落在本命的", h.Palace(iztro.PalaceSoul, iztro.ScopeDecadal).Name)
fmt.Println("本命命宫是", h.Palace(iztro.PalaceSoul, iztro.ScopeOrigin).Name)

输出

大限命宫落在本命的 夫妻
本命命宫是 命宫

边界与陷阱

返回的是本命盘上的那一格

返回的宫位对象上,Name 仍是本命宫名(例中的夫妻),因为它就是本命盘上的那一格。 要看该格在大限层级叫什么,查 h.Decadal.PalaceNames[index]。


SurroundPalaces

用途 取某个运限层级下某宫的三方四正。

签名

func (h *Horoscope) SurroundPalaces(nameKeyOrName string, scope string) *SurroundedPalaces

参数 同 Palace。

返回值 *SurroundedPalaces,判断方法见三方四正。

示例

h, _ := chart.Horoscope("2025-6-1", 0)
sp := h.SurroundPalaces(iztro.PalaceWealth, iztro.ScopeYearly)

fmt.Println("流年财帛的三方四正以本命", sp.Target.Name, "为本宫")

输出

流年财帛的三方四正以本命 疾厄 为本宫

HasHoroscopeStars / HasOneOfHoroscopeStars / NotHaveHoroscopeStars

用途 判断某层级某宫里有没有指定的流耀。

斗数含义 流耀是随运限层级产生的一组星:魁钺昌曲禄羊陀马鸾喜。 它们在不同层级有不同名字——大限层级叫运魁、运钺,流年层级叫流魁、流钺, 含义相同但作用于各自的时间跨度。

签名

func (h *Horoscope) HasHoroscopeStars(nameKeyOrName string, scope string, stars []string) bool
func (h *Horoscope) HasOneOfHoroscopeStars(nameKeyOrName string, scope string, stars []string) bool
func (h *Horoscope) NotHaveHoroscopeStars(nameKeyOrName string, scope string, stars []string) bool

参数

参数类型必填默认说明
nameKeyOrNamestring是—该层级下的宫名
scopestring是—运限层级
stars[]string是—流耀标识切片,须用该层级的名字

返回值

方法语义
HasHoroscopeStars每一颗都在
HasOneOfHoroscopeStars至少一颗在
NotHaveHoroscopeStars一颗都不在

示例

h, _ := chart.Horoscope("2025-6-1", 0)

fmt.Println(h.HasHoroscopeStars(iztro.PalaceSoul, iztro.ScopeDecadal, []string{"yunlu"}))
fmt.Println(h.HasOneOfHoroscopeStars(iztro.PalaceSoul, iztro.ScopeDecadal, []string{"yunlu", "yunyang"}))
fmt.Println(h.NotHaveHoroscopeStars(iztro.PalaceSoul, iztro.ScopeDecadal, []string{"yuntuo"}))

输出

false
false
true

边界与陷阱


HasHoroscopeMutagen

用途 判断某层级某宫里有没有该层级天干引发的四化。

斗数含义 每个运限层级有自己的天干,会像生年干一样化出四颗星。 「大限化禄落在大限财帛」这类判断问的就是这个。

签名

func (h *Horoscope) HasHoroscopeMutagen(nameKeyOrName string, scope string, mutagenKey string) bool

参数

参数类型必填默认说明
nameKeyOrNamestring是—该层级下的宫名
scopestring是—运限层级
mutagenKeystring是—四化标识

返回值 bool。检查该层级天干化出的那颗星是否落在目标宫的主星或辅星里(不看杂耀)。

示例

h, _ := chart.Horoscope("2025-6-1", 0)

fmt.Println(h.HasHoroscopeMutagen(iztro.PalaceSoul, iztro.ScopeDecadal, iztro.MutagenLu))
fmt.Println(h.Decadal.Mutagen)

输出

false
[太阳 武曲 太阴 天同]

大限干为庚,庚干四化为太阳化禄、武曲化权、太阴化科、天同化忌。

边界与陷阱

scope 为 ScopeOrigin 时恒为 false

本命层级没有「层级天干」这回事——生年四化已经打在星耀自身的 MutagenKey 上。 HasHoroscopeMutagen(name, iztro.ScopeOrigin, m) 因此直接返回 false, 不代表本命盘上没有这个四化。要查本命四化,用宫位的 HasMutagen。


ScopeItem / Astrolabe

用途 按层级标识取对应的 HoroscopeScope,或回到本命盘。

签名

func (h *Horoscope) ScopeItem(scope string) *HoroscopeScope
func (h *Horoscope) Astrolabe() *Astrolabe

返回值 ScopeItem 在层级为 ScopeOrigin 或未知层级时返回 nil——本命不是运限层级。

示例

h, _ := chart.Horoscope("2025-6-1", 0)

fmt.Println(h.ScopeItem(iztro.ScopeDecadal).Name)
fmt.Println(h.ScopeItem(iztro.ScopeOrigin))
fmt.Println(h.Astrolabe().SolarDate)

输出

大限
<nil>
2000-8-16

边界与陷阱

ScopeItem 用于写按层级参数化的通用逻辑,比一串 switch scope 简洁。 返回 nil 时记得判空。


ToText

用途 运限的语义化文本:面向语言模型与人的完整描述。

签名

func (h *Horoscope) ToText() (string, error)
func (h *Horoscope) ToTextContext(ctx context.Context) (string, error)

返回值 string——按星盘排盘语言输出的 Markdown 子集:# 运限 <日期> (<农历>) 标题下, 大限(未起运写童限)、小限、流年、流月、流日、流时各一个 ## 节,每节带该层命宫落在本命何宫、 四化(带落宫)、流耀与该层视角的格局行;大限与流年另展开十二宫表。 完整格式见语义化文本。

示例

h, _ := chart.Horoscope("2025-1-1", 0)
text, _ := h.ToText()

fmt.Println(strings.Join(strings.Split(text, "\n")[:5], "\n"))

输出

# 运限 2025-1-1 (二〇二四年腊月初二)

## 大限 · 命宫: 本命夫妻 (庚辰)
- 四化: 太阳化禄→本命子女, 武曲化权→本命财帛, 太阴化科→本命仆役, 天同化忌→本命疾厄
- 格局: 杀破狼 (命宫), 风云际会 (命宫)

格局命中的文本另见 PatternsToText(格局判定)。


ToTextWith

用途 ToText 的文本,按 opts 带上知识包里的释义:每一层的表或事实行之后紧跟该层流耀的释义 与该层视角命中格局的释义,同一颗流耀、同一个格局跨层只释义一次。 本命星耀的释义不在这里,在星盘的 ToTextWith 里。

签名

func (h *Horoscope) ToTextWith(opts TextOptions) (string, error)
func (h *Horoscope) ToTextWithContext(ctx context.Context, opts TextOptions) (string, error)

参数

参数类型说明
optsTextOptions输出选项。Knowledge 字段给释义材料来源:BuiltinKnowledge() 取盘语言的内嵌默认包,KnowledgeFrom(pack) 用给定的包;PatternConfig 字段给各层格局行与格局释义的判定口径;零值 TextOptions{} 等同 ToText

释义的插入位置与去重规则见带释义的文本。

示例

h, _ := chart.Horoscope("2025-1-1", 0)
plain, _ := h.ToText()
text, _ := h.ToTextWith(iztro.TextOptions{Knowledge: iztro.BuiltinKnowledge()})

fmt.Println(utf8.RuneCountInString(plain), utf8.RuneCountInString(text))
for _, l := range strings.Split(text, "\n") {
    if strings.HasPrefix(l, "## ") {
        fmt.Println(l)
    }
}

输出

2457 8458
## 大限 · 命宫: 本命夫妻 (庚辰)
## 小限 · 命宫: 本命官禄 · 虚岁 25
## 流年 · 命宫: 本命夫妻 (甲辰)
## 流月 · 命宫: 本命仆役 (丁丑)
## 流日 · 命宫: 本命迁移 (庚午)
## 流时 · 命宫: 本命迁移 (丙子)

两份文本的 ## 节完全相同:释义不另起节,插在各层之后。

BuiltinKnowledge() 用在没有内嵌包的语言(目前只有 zh-CN 有)的盘上返回 ErrInvalidArgument。

本页目录