结构体字段没被赋值,根本原因是字段未导出(首字母小写),go 的 json.unmarshal 仅处理首字母大写的导出字段,小写字段如 name string 会被静默忽略,既不报错也不赋值,导致字段保持零值。

结构体字段没被赋值?先看首字母是不是大写
Go 的 json.Unmarshal 只处理导出字段,小写字母开头的字段(比如 name string)会被完全忽略,不报错也不赋值。你看到结构体字段还是零值,大概率就是这个原因。
- 把
name改成Name,email改成Email - 标签里可以继续用小写键名:
`json:"user_name"`,不影响序列化结果 - 别在函数里定义结构体——包级作用域才有效
JSON 字段含反斜杠、引号、Unicode?不用额外转义
标准 JSON 解析器(包括 Go 的 encoding/json)原生支持转义字符。只要输入是合法 JSON,比如 "name": "O\"Reilly" 或 "title": "Café\u00e9",json.Unmarshal 会自动解码为正确的 Go 字符串值。
- 不需要手动调用
strings.Replace或正则清理 - 如果解析失败,错误通常是语法问题(比如漏了引号、多了一个逗号),而不是特殊字符本身
- 检查原始字节:打印
len(data)和前 100 字节,比猜更准
字段值可能是字符串也可能是数字?加 ,string 标签
有些 API 返回的数值字段(如 "age")有时是数字 25,有时是字符串 "25"。直接映射到 int 会 panic。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 用
Age int `json:"age,string"`,Go 就能接受两种格式 - 布尔字段同理:
Active bool `json:"active,string"`可解析"true"或true - 注意:
,string仅对数字和布尔类型生效,对浮点数慎用(精度可能丢失)
嵌套字段结构不固定?别硬塞 struct,用 json.RawMessage
当某个字段内容可能是对象、数组或 null(比如 Webhook 的 data 字段),直接反序列化到固定结构体会失败或静默丢数据。
- 先声明为
Data json.RawMessage `json:"data"` - 反序列化主结构体后,再判断
Data内容:len(Data) == 0表示 null;首字节是{就按对象解析,是[就按切片解析 - 别复用原始
[]byte:json.RawMessage是引用,源数据被释放后内容就不可靠
最常被忽略的其实是字段导出规则和 json.RawMessage 的生命周期——不是所有“看起来像 JSON”的字节流都能直接进 struct,得先确认它到底是什么结构、谁控制它的内存。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










