go中struct字段用json tag重命名需写为json:"name",空值省略需加omitempty,且字段必须首字母大写导出,嵌套结构体需各自标注tag,匿名字段和大小写规则不可忽略。

struct字段怎么用json tag改名
Go里结构体转JSON时,默认用字段名当key,想改成别的名字,必须加json tag。不加tag,哪怕字段首字母大写,也只会按原名序列化。
实操建议:
-
json:"name"表示强制用name作key;json:"name,omitempty"表示值为空(零值)时不输出该字段 - tag里不能有空格,比如
json:" user_id "会解析失败,得写成json:"user_id" - 字段名是
UserID,但想JSON里叫user_id,就写json:"user_id",Go不会自动转下划线 - 如果字段名是
RawData,且值是[]byte,想直接当JSON嵌入(不转义),得配json:",string",但这是另一类需求,和重命名无关
空值字段不出现要加omitempty
默认情况下,哪怕字段是空字符串、0、nil切片,也会出现在JSON里。想跳过这些“零值”,必须显式加omitempty。
常见错误现象:
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- API返回
{"name":"","age":0,"tags":null},但前端希望这几个字段压根别出现 - 写了
json:"name,omitempty",但字段是*string且指针为nil,这时omitempty才生效;如果是string类型且值为空串,omitempty也会生效 -
omitempty对time.Time字段要注意:零时间time.Time{}会被忽略,但只要调过time.Now()哪怕秒数为0,就不算零值
嵌套结构体的tag互相独立
外层结构体的json tag不会影响内层字段,每层都得自己标。
使用场景:
- 你有个
User结构体嵌在Response里,想让User.Name变成full_name,就得在User定义里给Name字段加json:"full_name",而不是在Response里操作 - 如果嵌套字段用了匿名结构体,比如
struct{ Name string `json:"nick"` },它的tag只作用于那一层,不影响外层字段命名逻辑 - 别指望靠外层字段名来“覆盖”内层——Go的JSON encoder不认这个
注意大小写和导出规则
字段名首字母小写(未导出)时,无论加什么json tag都没用,encoder直接跳过。
为什么这样做:
- Go的
encoding/json只序列化导出字段(首字母大写),这是硬性限制,不是bug - 写
name string `json:"name"`看起来没问题,但运行时JSON里根本不会出现name字段 - 容易踩的坑:从JSON反序列化时,小写字段能接收数据(因为unmarshal不检查导出性),但序列化时永远不输出——这种不对称容易让人困惑
omitempty行为、导出性、嵌套层级这三块最容易漏掉细节。特别是多人协作时,有人改了struct没同步更新tag,或者把omitempty加在了不该加的地方,结果API字段突然消失或冒出来,查起来很花时间。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










