Go语言中值类型与引用类型在JSON Unmarshal解析时,如何区分两者的不同处理方式?

2026-04-29 00:360阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1046个文字,预计阅读时间需要5分钟。

Go语言中值类型与引用类型在JSON Unmarshal解析时,如何区分两者的不同处理方式?

在Go语言中,`json.Unmarshal`函数内部依赖于反射(reflection)来修改目标变量的内存内容。如果传入的是值(例如`user`),而不是指针(例如`&user`),`json.Unmarshal`会失败,因为它无法直接修改非指针类型的变量。因此,必须传入指向目标变量的指针,以确保`json.Unmarshal`能够正确地修改内存中的内容。

  • 常见错误现象:json.Unmarshal([]byte(`{"name":"a"}`), user)user.Name 仍是空字符串,无报错但无效果
  • 值类型(如 structintstring)必须取地址传入;引用类型(如 *struct[]intmap[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解析时,如何区分两者的不同处理方式?

在Go语言中,`json.Unmarshal`函数内部依赖于反射(reflection)来修改目标变量的内存内容。如果传入的是值(例如`user`),而不是指针(例如`&user`),`json.Unmarshal`会失败,因为它无法直接修改非指针类型的变量。因此,必须传入指向目标变量的指针,以确保`json.Unmarshal`能够正确地修改内存中的内容。

  • 常见错误现象:json.Unmarshal([]byte(`{"name":"a"}`), user)user.Name 仍是空字符串,无报错但无效果
  • 值类型(如 structintstring)必须取地址传入;引用类型(如 *struct[]intmap[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 要能匹配到。

阅读全文