我对golang和一般的编译语言还很陌生,所以请原谅我的无知。在这样的一些代码中:

package main

import "fmt"

func assign() int {
  return 1
}

func reference(foo *int) int {
  *foo = 2
  return 0
}

func main() {
  var a, b int

  a = assign()
  reference(&b)

  fmt.Println(a)
  fmt.Println(b)
}

...将值分配给a与通过引用传递b之间的实际区别是什么?

就实际代码而言,为什么json.Unmarshal()要求您传递一个指向空变量的指针,而不仅仅是返回Unmarshalled值,以便可以将其分配给变量?

最佳答案

按值传递需要复制参数,但是在引用的情况下,只需将指针发送到对象即可。默认情况下,Golang会按值传递,包括 slice 。

对于有关json.Unmarshal的特定问题,我相信原因是这样,Unmarshal代码可以验证传入的对象是否包含与json中具有兼容类型的相同字段名称。例如,如果json具有重复字段,则在我们要编码到的对象中需要有一个对应的 slice 。

因此,我们需要传入想要将json字符串解码的结构。它必须是一个指针,以便Unmarshal可以填充字段。如果仅传递通用接口(interface),Unmarshal将返回 map 。如果Unmarshal不采用指向结构/接口(interface)的指针,则可以将其实现为始终返回映射,但是我认为这种方式更有用。

这是一个简单的示例,但可能很有用-https://play.golang.org/p/-n8euepSS0

关于pointers - 变量赋值和通过引用传递之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39112338/

10-15 07:08