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

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


慕容708150
浏览 264回答 1
1回答

米脂

按值传递需要复制参数,但是在引用的情况下,您只需将指针发送到对象。Golang 默认通过值传递,包括切片。对于json.Unmarshal的具体问题,我相信原因是Unmarshal代码可以验证传入的对象是否包含与json中找到的兼容类型的相同字段名称。例如,如果 json 有一个重复的字段,则我们要解组的对象中需要有一个对应的切片。因此,我们需要传入我们希望将 json 字符串解组到的结构。它需要是一个指针,以便 Unmarshal 可以填充字段。如果你只是传递一个通用接口,Unmarshal 将返回一个映射。如果 Unmarshal 不采用指向结构/接口的指针,它可以实现为始终返回映射,但我认为这种方式更有用。这是一个简单的例子,但可能有用 - https://play.golang.org/p/-n8euepSS0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go