首页 >后端开发 >Golang >为什么 `json.Unmarshal` 使用引用而不是指针?

为什么 `json.Unmarshal` 使用引用而不是指针?

Barbara Streisand
Barbara Streisand原创
2024-11-12 04:57:01516浏览

Why Does `json.Unmarshal` Work with a Reference but Not a Pointer?

为什么 Unmarshal 使用引用而不是指针?

为了提供此查询的上下文,在 Go 中,json.Unmarshal 函数反序列化JSON 数据到所提供的引用指向的结构中。让我们深入研究 Unmarshal 在两种场景下的行为。

场景 1:对结构体的引用

在第一个场景中,对结构体的非零引用是传递给 Unmarshal,如以下代码片段所示:

var animals Animal
err := json.Unmarshal(jsonBlob, &animals)

这可以无缝运行。根据文档,如果指针为 nil(初始化为零),Unmarshal 会分配一个新的结构值来指向。然而,在这种情况下,animals 已经初始化并指向一个有效的结构体,因此操作成功。

场景 2:指向结构体的指针

在此场景中,一个指向结构体的未初始化指针被传递给 Unmarshal。

var animals *Animal
err := json.Unmarshal(jsonBlob, animals)

结果在“无效参数”错误中:

json: Unmarshal(nil *main.Animal)

出现这种情况是因为文档不完全清楚。虽然它提到如果指针为 nil,Unmarshal 会分配一个新结构,但它没有明确声明指针本身必须为非 nil,如 Unmarshal 源代码中的以下注释所示:

// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
// (The argument to Unmarshal must be a non-nil pointer.)

因此,将未初始化的指针(Go 中默认为 nil)传递给 Unmarshal 会触发此错误,因为它违反了非 nil 指针的要求。要解决此问题,只需在调用 Unmarshal 之前将指针初始化为新结构即可。

“Unmarshaling”的拼写

至于拼写,“unmarshalling”和“unmarshaling” 是可接受的拼写,根据 Go 源代码的 grep,第二种在 Go 代码中更常见代码库。

以上是为什么 `json.Unmarshal` 使用引用而不是指针?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn