Go嵌套结构体需警惕字段冲突、nil panic、JSON tag不继承、零值误判四大陷阱应显式命名避冲突检查nil再访问内层写json tag敏感字段用指针或Valid标记。Go 语言嵌套结构体不是“要不要用”的问题而是“怎么嵌套才不会掉坑里”的问题——直接匿名字段嵌套最常用但字段冲突、零值传播、JSON 序列化行为这些地方一不留神就出 bug。匿名字段嵌套时字段名冲突怎么办Go 允许用类型名如 Person作为字段名省略形成匿名字段。但若两个匿名字段含同名字段比如都含 Name编译直接报错ambiguous selector。显式命名字段可破冲突把 Person 改成 Author Person 或 Editor Person匿名字段只在“单一继承语义”下安全多个同名字段类型混用时必须放弃匿名写法嵌套层级超过两层后user.Profile.Address.City 这种链式访问看着顺但一旦中间某层是 nil运行时 panic —— 别依赖编译器帮你挡空指针JSON 序列化时匿名字段的 tag 覆盖规则嵌套结构体默认会把内层字段“提上来”但 json tag 不会自动继承。比如外层结构体没写 json:- 内层字段即使有 json:name也大概率被忽略。外层结构体字段若为匿名其 tag 完全无效真正起作用的是内层字段自己的 tag想控制序列化字段名必须在内层结构体定义时就写好 json:xxx外层加 tag 没用如果内层字段是私有小写开头即使有 tagjson.Marshal 也序列化不出它 —— Go 的反射规则不穿透私有字段嵌套结构体初始化时零值传播的隐性影响声明一个含匿名 Time 字段的结构体不显式初始化整个 Time 就是零值 0001-01-01 00:00:00 0000 UTC。这不是 bug是设计但业务上常被当成“未设置”误判。 Mokker AI AI产品图添加背景