pointers - 当我将变量传递给 golang 中的私有(private)方法时,它会创建一个新实例吗?

标签 pointers variables go

如果我有主要功能:

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/

相关文章:

unit-testing - 在 go 中正确测试 http 路由

将指针转换为非指针类型

c++ - 为什么我可以将 std::map 的键传递给需要非常量的函数?

arrays - 当 (void *) p == (void *) *p - 标准对此有何评论?

swift - 在 Swift 中,如何声明键为函数的字典? (不符合协议(protocol) 'Hashable' )

c - C 中的大整数?

performance - 一阶公式中变量的有效重命名

java - 命名静态 int 变量

heroku - 在 heroku 中使用本地包 Revel 应用程序

go - 如何解析表单后的数组