首页  >  文章  >  后端开发  >  为什么 `json.Unmarshal` 因指向原始类型的 Nil 指针而失败?

为什么 `json.Unmarshal` 因指向原始类型的 Nil 指针而失败?

DDD
DDD原创
2024-11-22 08:50:19601浏览

Why Does `json.Unmarshal` Fail with a Nil Pointer to Primitive Types?

解组 JSON:指针与引用

json.Unmarshal 函数允许我们将 JSON 数据转换为 Go 结构体。虽然文档表明如果指针为零,它可以分配一个新值,但事实并非如此。

考虑以下示例:

var animals Animal

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

这按预期工作,因为动物是非零指针。但是,如果我们将 Animals 更改为未初始化的指针:

var animals *Animal

err := json.Unmarshal(jsonBlob, animals)

此操作会失败,并显示模糊的错误消息:

json: Unmarshal(nil *main.Animal)

此错误源于 InvalidUnmarshalError,当无效时会抛出该错误参数被传递给 Unmarshal。文档没有明确声明指针必须为非 nil,这可能会导致混乱。

文档中的冲突引用表明 Unmarshal 可以为 nil 指针分配新值,可能是指到 Reflect.New 函数的行为,Unmarshal 在内部使用该函数在指针为 nil 时创建一个新值。但是,reflect.New 仅适用于某些类型,例如结构和切片。它不适用于指向原始类型的指针,例如 *int 或 *string。

总之,json.Unmarshal 需要一个非 nil 指针作为其第二个参数。它不能为原始类型的 nil 指针分配新值。因此,在尝试将 JSON 数据解组到其中之前,确保指针不为 nil 非常重要。

以上是为什么 `json.Unmarshal` 因指向原始类型的 Nil 指针而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

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