为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_笑_17 2021-07-09 14:00:36
这个来自json.Unmarshal文档的例子(为了简单使用Animal而不是稍微修改[]Animal)有效,没有错误:// ...var animals Animalerr := json.Unmarshal(jsonBlob, &animals)// ...但是这个稍微修改的例子没有:// ...var animals *Animalerr := json.Unmarshal(jsonBlob, animals)// ...它显示了这个确实没有帮助的模糊错误(看起来更像是函数调用而不是错误 IMO):json: Unmarshal(nil *main.Animal)这似乎是因为animals是一个未初始化的指针。但是文档说(强调我的):Unmarshal 将 JSON 解组为指针指向的值。如果指针为 nil,则 Unmarshal 为其分配一个新值以指向它。那么为什么在第二个示例中解组失败并显示出那个晦涩的错误呢?(此外,它是“解组”还是“解组”(一个 L)?文档同时使用了两者。)
查看完整描述

3 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

您遇到了InvalidUnmarshalError(请参阅decode.go 中的第 109 和 110 行)。

// InvalidUnmarshalError 描述了传递给 Unmarshal 的无效参数。
// (Unmarshal 的参数必须是非 nil 指针。)

似乎文档可以做一些澄清,因为上面的引用和下面来自Unmarshal来源的评论似乎相互矛盾。

如果指针为 nil,则 Unmarshal 为其分配一个新值以指向它。


查看完整回答
反对 回复 2021-07-12
?
跃然一笑

TA贡献1826条经验 获得超6个赞

我相信问题在于,虽然您可以将指向 nil的指针传递给 Unmarshal(),但您不能传递nil 指针 value。


指向 nil 的指针类似于:


var v interface{}

json.Unmarshal(text, &v)

的值为vnil,但指向的指针v是非零指针地址。它是一个非零指针,指向一个 nil interface{}(它本身是一个指针类型)。在这种情况下,解组不会返回错误。


一个 nil 指针是这样的:


var v *interface{}

json.Unmarshal(text, v)

在这种情况下, v 的类型是pointer to an interface{},但与 golang 中 var 的任何声明一样, 的初始值v是该类型的零值。所以v是一个零值指针,这意味着它不指向内存中任何有效的地方。



查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 287 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信