变量赋值和引用传递之间有什么区别?

时间:2016-08-23 23:46:07

标签: pointers go

我对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值,以便将它分配给您的变量?

1 个答案:

答案 0 :(得分:0)

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

关于json.Unmarshal的具体问题,我认为原因是Unmarshal代码可以验证传入的对象是否包含与json中找到的兼容类型相同的字段名称。例如,如果json有一个重复的字段,那么我们要解组的对象中需要有一个对应的切片。

因此,我们需要传入我们希望json字符串解组的结构。它需要是一个指针,以便Unmarshal可以填充字段。如果您只是传递通用接口,Unmarshal将返回一个地图。如果Unmarshal没有指向结构/接口的指针,它可能已被实现为总是返回一个地图,但我认为这样更有用。

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