
go语言中json.unmarshal返回nil表示解析成功而非失败
在Go语言中,json.Unmarshal函数的设计遵循标准错误处理模式:它返回一个error类型的第二个返回值,当该值为nil时,表明JSON解析成功;非nil才表示发生错误(如格式错误、类型不匹配等)。你遇到的输出 Unmarshalled:
正确的用法如下:
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) // ✅ 此处打印解码后的结构体/值⚠️ 关键注意事项:
- &p 中的 p 必须是已声明的变量,且其类型需与JSON数据结构兼容(例如,若JSON为 {"Title":"a","Content":"b"},则 p 应为对应字段的结构体,且字段需导出——首字母大写);
- 若 p 是零值(如 var p MyStruct),解码后将被正确填充;若 p 为 nil 指针(如 var p *MyStruct 且未初始化),json.Unmarshal 会返回 json: Unmarshal(nil *T) 错误;
- json.Unmarshal 不会自动创建新变量,它只修改传入地址所指向的内存,因此必须确保 &p 合法有效。
✅ 示例结构体定义参考:
立即学习“go语言免费学习笔记(深入)”;
type Post struct {
Title string `json:"Title"`
Content string `json:"Content"`
}
var p Post总结:json.Unmarshal 返回 nil 是成功的信号,不是bug。调试时请始终检查 err 判断是否出错,并通过目标变量 p 查看实际解码结果。










