如果我有主要功能:
var a = "foo"
modify(a)
fmt.Println(a)
,其中
func modify(s string) error {
s = "bar"
}
结果是"foo"
还是"bar"
?
答案 0 :(得分:0)
无。它不会编译,因为'foo'
和'bar'
都不是单个字符。但是,让我们说你用双引号代替。
在Golang中,参数按值传递(它们被复制到内存中的新位置 - 堆栈或堆),无论是私有方法还是公共方法或任意函数都无关紧要。新实例已修改。您的示例的结果将是"foo"
。
为了修改位于函数外部的变量,必须显式传递指向此变量的指针。
func modify(s *string) {
*s = "bar"
}
...
var a = "foo"
modify(&a)
println(a) // will print "bar"
在这种情况下,指针本身由值传递(它被复制),但其值(a
的地址)仍然指向同一个变量。所以a
可以通过指针修改。