如果我有主要功能:
var a = "foo"
modify(a)
fmt.Println(a)
在哪里
func modify(s string) error {
s = "bar"
}
结果是 "foo"
还是 "bar"
?
最佳答案
没有。它不会编译,因为 'foo'
和 'bar'
都不是单个字符。但是假设您改用双引号。
在 Golang 中,参数是按值传递的(它们被复制到内存中的新位置 - 堆栈或堆),无论是私有(private)方法还是公共(public)方法或任意函数都无关紧要。新实例已修改。您的示例的结果将是 "foo"
。
为了修改位于函数外部的变量,您必须显式传递指向此类变量的指针。
func modify(s *string) {
*s = "bar"
}
...
var a = "foo"
modify(&a)
println(a) // will print "bar"
在这种情况下,指针本身通过值传递(它被复制)但它的值(a
的地址)仍然指向同一个变量。所以a
可以通过指针修改。
关于pointers - 当我将变量传递给 golang 中的私有(private)方法时,它会创建一个新实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50684401/