
`json.unmarshal`返回`nil`表示解码成功,而非失败;开发者常误将其当作解码结果打印,实际应检查错误值并输出目标变量内容。
在 Go 语言中,json.Unmarshal 函数的签名如下:
func Unmarshal(data []byte, v interface{}) error它不返回解码后的值,而是将解析结果写入传入的指针变量 v 中,并仅返回一个 error 类型的值:nil 表示解析成功,非 nil 表示发生错误(如格式非法、类型不匹配、字段不可导出等)。
你遇到的现象——fmt.Println("Unmarshalled:", uncoded) 输出
✅ 正确用法如下:
立即学习“go语言免费学习笔记(深入)”;
coded := redis.LoadFromBase()
err := json.Unmarshal(coded, &p) // 注意:&p 必须是指向可导出结构体字段的指针
if err != nil {
log.Fatalf("JSON unmarshal failed: %v", err)
}
fmt.Println("Bytes:", coded)
fmt.Println("Unmarshalled:", p) // ✅ 打印解码后的实际数据? 关键注意事项:
- 结构体字段必须首字母大写(可导出):json.Unmarshal 只能设置导出字段。若 p 是自定义结构体,请确保 Title、Content 等字段名以大写字母开头,并配有对应 JSON tag(如 json:"Title" 或 json:"title");
- 务必传入地址(&p):Unmarshal 需要修改原始变量,必须传递指针;
- 提前验证 JSON 字节流有效性:可先用 string(coded) 查看是否为合法 JSON(如 {"Title":"a","Content":"b"}),避免空字节、BOM、编码污染等问题;
- 推荐使用 errors.Is(err, io.EOF) 等细化错误处理,而非仅判空。
? 小技巧:开发阶段可添加一行调试输出快速验证:
fmt.Printf("Parsed JSON: %+v\n", p)这样既能确认结构体是否被正确填充,也能排查字段映射问题。记住:json.Unmarshal 的返回值是“健康报告”,不是“体检结果”——nil 是好消息,真正要关注的是 p 本身。










