当我在golang中将变量传递给私有方法时,它是否创建了一个新实例?

时间:2018-06-04 15:49:22

标签: pointers variables go

如果我有主要功能:

var a = "foo"
modify(a)
fmt.Println(a)

,其中

func modify(s string) error {
  s = "bar"
}

结果是"foo"还是"bar"

1 个答案:

答案 0 :(得分:0)

无。它不会编译,因为'foo''bar'都不是单个字符。但是,让我们说你用双引号代替。

在Golang中,参数按值传递(它们被复制到内存中的新位置 - 堆栈或堆),无论是私有方法还是公共方法或任意函数都无关紧要。新实例已修改。您的示例的结果将是"foo"

为了修改位于函数外部的变量,必须显式传递指向此变量的指针。

func modify(s *string) {
  *s = "bar"
}

...

var a = "foo"
modify(&a)
println(a) // will print "bar"

在这种情况下,指针本身由值传递(它被复制),但其值(a的地址)仍然指向同一个变量。所以a可以通过指针修改。