这个来自json.Unmarshal docs的示例(为便于使用Animal而不是进行了稍微修改[]Animal)有效,没有错误:
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它是未初始化的指针。但是文档说(重点是我的):
animals
Unmarshal将JSON解组为指针所指向的值。 如果指针为nil,则Unmarshal为其分配一个新值以使其指向。
那么,为什么在第二个示例中取消编组失败并显示出晦涩的错误?
(此外,是“解组”还是“解组”(一个L)?文档同时使用。)
您遇到了InvalidUnmarshalError(请参阅encode.go中的第109和110行)。
// InvalidUnmarshalError描述了传递给Unmarshal的无效参数。 // (Unmarshal的参数必须是非nil指针。)
似乎文档可以做些澄清,因为上面的引用和下面来自Unmarshal源的注释似乎相互矛盾。
Unmarshal
如果指针为nil,则Unmarshal为其分配一个新值以使其指向。