Pointers 什么';变量赋值和引用传递之间的区别是什么?

Pointers 什么';变量赋值和引用传递之间的区别是什么?,pointers,go,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.Printl

我对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()要求您传递指向空变量的指针,而不仅仅是返回未经解析的值,以便将其分配给变量?

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

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

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


这是一个简单的示例,但可能很有用-

Go是“按值传递”。因此
reference
函数使用指向恰好是参考值的整数的指针。你也不需要在那个函数中返回任何东西。啊,我明白了。我没有考虑将特定类型传递给json.Unmarshal()并使用它“过滤”返回值。到目前为止,在我看到的所有示例中,所有内容都使用了一个接口{}来收集JSON中的所有属性。然而,如果该方法解析json并返回它,您将没有选择。“Golang在默认情况下会按值传递,包括对切片的传递。”-没错,但它有点复杂,因为切片本身包含一个指向数据的指针,因此它充当引用类型,例如,即使按值传递,您也可以修改元素:但根据容量的不同,追加可能有效,也可能无效(因为追加可能会修改指向新内存位置的指针):