结构体字段 tag 写错格式会导致 json 解析静默失败:必须用反引号包裹且内部键值对用英文双引号,如 json:"name";写成 json:name 或 json:'name' 会被忽略,不报错但字段为空。

结构体字段 tag 写错格式会导致 JSON 解析失败
Go 的 struct tag 不是注释,而是字符串字面量,必须用反引号 `json:"name"` 包裹,且内部键值对要用双引号。写成 json:name 或 json:'name' 都会被忽略——json.Unmarshal 完全不报错,只是静默跳过该字段。
- 合法写法:
`json:"user_id"`、`json:"user_id,omitempty"`、`json:"-"` - 常见错误:
`json:user_id`(缺双引号)、`json:"user_id",omitempty`(逗号后没空格+没引号包裹 omitempty) - 多个 tag 共存时用空格分隔:
`json:"id" db:"id" xml:"id"`,不能用逗号或换行
嵌套结构体里用 json:",inline" 合并字段
当内嵌结构体字段需要“展平”到外层 JSON 中(而不是生成嵌套对象),得用 inline。否则默认会按字段名生成二级 key,比如 UserInfo{Name: "Alice"} 在嵌套时输出 {"user_info":{"name":"Alice"}},而加了 inline 就变成 {"name":"Alice"}。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
-
inline只对匿名字段生效;命名字段即使加了也无效 - 冲突字段会覆盖:若外层和内层都有
json:"id",外层优先 - 慎用在有同名字段的嵌套结构中,容易意外覆盖
自定义 UnmarshalJSON 时别漏掉 json.RawMessage
如果结构体字段类型不是基础类型(比如要解析成 map 或动态结构),直接用 json:"xxx" 会触发默认解码逻辑,可能 panic 或丢数据。正确做法是先用 json.RawMessage 暂存原始字节,再在自定义 UnmarshalJSON 方法里手动处理。
- 字段声明:
Data json.RawMessage `json:"data"` - 否则写成
Data map[string]interface{} `json:"data"`,遇到 null 或非 object 类型会直接报错json: cannot unmarshal ... into Go value of type map[string]interface{} -
RawMessage不会解析,也不校验,把解析时机完全交给你控制
第三方库如 GORM、Validator 对 tag 的依赖比标准库更敏感
GORM 用 gorm:"column:id;primaryKey",validator 用 validate:"required,email",这些 tag 不影响 json 行为,但一旦拼写错误(比如 gorm:"primarykey" 少了个下划线),GORM 就当普通字段处理——可能漏建主键、索引失效、甚至插入时 panic。
- 不同库 tag key 大小写敏感:GORM 是
primaryKey,不是primarykey;validator 是required,不是require - 多个库共用一个 struct 时,tag 顺序无关,但内容不能冲突(比如
json和db字段名不同,就得分别写清楚) - IDE 通常不校验 tag 值,只能靠单元测试或运行时暴露问题
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










