为什么 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中文网其他相关文章!