一尘不染

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

go

这个来自json.Unmarshal
docs的示例(为便于使用Animal而不是进行了稍微修改[]Animal)有效,没有错误:

工作示例的游乐场链接

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

但是这个经过稍微修改的示例却没有:

非工作示例的游乐场链接

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

它显示了这个实际上并没有帮助的模糊错误(看起来更像是一个函数调用,而不是错误的IMO):

json:Unmarshal(nil * main.Animal)

这似乎是因为animals它是未初始化的指针。但是文档说(重点是我的):

Unmarshal将JSON解组为指针所指向的值。 如果指针为nil,则Unmarshal为其分配一个新值以使其指向。

那么,为什么在第二个示例中取消编组失败并显示出晦涩的错误?

(此外,是“解组”还是“解组”(一个L)?文档同时使用。)


阅读 314

收藏
2020-07-02

共1个答案

一尘不染

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

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

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

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

2020-07-02