解组 JSON:揭示引用和指针之间的差异
在 JSON 解析领域,json.Unmarshal 是不可或缺的工具。然而,它的行为有时会令人费解。具体来说,用户可能想知道为什么在使用引用时解组工作顺利,但在使用指针时却神秘地失败了。让我们深入探讨这个问题的本质。
引用与指针
在第一个示例中,我们将“animals”定义为 Animal 类型变量。当我们将“&animals”传递给 Unmarshal 时,我们提供了对此变量的引用。这允许Unmarshal直接操作原始结构。
相反,第二个示例将“animals”声明为指向Animal类型的指针。指针保存另一个变量的地址,而不是变量本身。将“动物”直接传递给 Unmarshal 意味着我们正在传递一个 nil 指针,因为它尚未初始化。
悖论
奇怪的是,Unmarshal 的文档指出:如果指针为零,它可以为指针分配一个新值。那么,为什么第二个示例会失败?
揭开错误
第二个示例中的错误消息实际上是 InvalidUnmarshalError。当传递给 Unmarshal 的参数是无效指针时,会引发此错误。尽管文档有这样的声明,Unmarshal 确实需要一个非零指针作为参数。
底线
要使用指针正确解组 JSON,您必须初始化它第一的。正如文档所暗示的,这可以通过在调用 Unmarshal 之前简单地为指针分配一个有效值来完成。
Unmarshalling 与 Unmarshaling
此外,您可能已经注意到该文档同时使用“解组”和“解组”。虽然这两种拼写都被认为是正确的,但“unmarshaling”是 Go 社区中更常见和首选的用法。
以上是为什么使用指针时 `json.Unmarshal` 失败,但使用引用时成功?的详细内容。更多信息请关注PHP中文网其他相关文章!