运限对象

六个运限层级的数据结构,以及不必再传星盘的宫位查询方法。

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

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

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

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

字段

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

小限与流年的区别

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

HoroscopeScope

字段类型说明
Indexint该层级落在哪一宫(宫位索引)
Namestring层级显示名,按输出语言翻译
HeavenlyStem / HeavenlyStemKeystring该层级的天干,决定它飞出的四化
EarthlyBranch / EarthlyBranchKeystring该层级的地支
PalaceNames / PalaceNameKeys[]string以该层级所在宫为命宫重推的十二宫名,按宫位索引排列
Mutagen / MutagenKeys[]string该层级天干引发的四化星,顺序为禄权科忌
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 侧不为小限与流年各开一个类型,而是把 NominalAgeYearlyDecStar 放进共用的 HoroscopeScope——其余层级上这两项为零值。 调用处因此可以写按层级参数化的通用逻辑。

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

h.Decadal.YearlyDecStarnil,直接取字段会 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
大限四化 [太阳 武曲 太阴 天同]
流年岁前十二神 [天德 吊客 病符]

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 时记得判空。

本页目录