当前位置: 首页 > 面试题库 >

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

莫翰藻
2023-03-14
问题内容

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

工作html" target="_blank">示例的游乐场链接

// ...
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)?文档同时使用。)


问题答案:

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

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

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

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



 类似资料:
  • 我使用的是JDK-8(x64)。对于<code>数组。sort</code>(原语)我在Java文档中找到了以下内容: 排序算法是弗拉基米尔·雅罗斯拉夫斯基、乔恩·本特利和约书亚·布洛赫的双轴快速排序。' 对于<code>集合。sort(对象)我找到了这个“Timsort”: 这个实现是一个稳定的、自适应的、迭代的合并…这个实现将指定的列表转储到一个数组中,对数组进行排序,并迭代列表,从数组中的相

  • 问题内容: 我有一张表,其中有一个名为的整数列。我在该列上有一个索引。 但是似乎Postgres不想使用我的索引: 知道为什么会这样吗? 问题答案: 因为: 您选择的行太多了,以至于读取整个表都比较便宜。

  • 问题内容: 我习惯于进行Java编程,在编程时,您无需真正考虑指针。但是,此刻我正在用C ++编写程序。在创建具有其他类成员的类时,何时应该使用指针,何时不应该使用指针?例如,什么时候我想这样做: 与此相反: 问题答案: 首先避免指针。 在以下情况下使用它们: 您想使用Pimpl习惯用法或抽象工厂。 该实例实际上是由程序的其他部分管理的,而该类仅需要能够访问它。 您想推迟对象的构建(即,您想 在

  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 问题内容: 我想编写一个函数,该函数接收 几种 类型的结构并从JSON解组。为此,我有另一组带有预定义签名的函数,这些函数返回struct实例,但是由于每个函数都返回不同类型的struct,因此函数签名具有的返回类型。 当我发送json.Unmarshal一个具体的结构时,它可以按照我的预期工作,但是当我发送相同的结构时,它将其转换为地图。 这是描述问题的简化示例代码: https://play.

  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。