Go语言中值类型与引用类型在JSON Unmarshal解析时,如何区分两者的不同处理方式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1046个文字,预计阅读时间需要5分钟。
在Go语言中,`json.Unmarshal`函数内部依赖于反射(reflection)来修改目标变量的内存内容。如果传入的是值(例如`user`),而不是指针(例如`&user`),`json.Unmarshal`会失败,因为它无法直接修改非指针类型的变量。因此,必须传入指向目标变量的指针,以确保`json.Unmarshal`能够正确地修改内存中的内容。
- 常见错误现象:
json.Unmarshal([]byte(`{"name":"a"}`), user)后user.Name仍是空字符串,无报错但无效果 - 值类型(如
struct、int、string)必须取地址传入;引用类型(如*struct、[]int、map[string]string)本身已含指针语义,但仍需确保非 nil - 例如
var m map[string]string; json.Unmarshal(b, m)会 panic:「panic: reflect: call of reflect.Value.SetMap on zero Value」——因为m是 nil,得先m = make(map[string]string)或直接传&m
struct 字段为什么没被赋值?
字段必须是导出的(首字母大写),且 JSON key 要能匹配到。
本文共计1046个文字,预计阅读时间需要5分钟。
在Go语言中,`json.Unmarshal`函数内部依赖于反射(reflection)来修改目标变量的内存内容。如果传入的是值(例如`user`),而不是指针(例如`&user`),`json.Unmarshal`会失败,因为它无法直接修改非指针类型的变量。因此,必须传入指向目标变量的指针,以确保`json.Unmarshal`能够正确地修改内存中的内容。
- 常见错误现象:
json.Unmarshal([]byte(`{"name":"a"}`), user)后user.Name仍是空字符串,无报错但无效果 - 值类型(如
struct、int、string)必须取地址传入;引用类型(如*struct、[]int、map[string]string)本身已含指针语义,但仍需确保非 nil - 例如
var m map[string]string; json.Unmarshal(b, m)会 panic:「panic: reflect: call of reflect.Value.SetMap on zero Value」——因为m是 nil,得先m = make(map[string]string)或直接传&m
struct 字段为什么没被赋值?
字段必须是导出的(首字母大写),且 JSON key 要能匹配到。

