go - 为什么我的结构中的变量不保持其值?

标签 go

如果我有:

type Foo struct {
  bar int
}

还有一个定义在 Foo 上的方法(注意它不是 *Foo,只是 Foo):

func (self Foo)incrementBar() {
  self.bar++
}

为什么在生成 Foo 并调用该方法两次之后:

myFoo := Foo{}
myFoo.incrementBar()
myFoo.incrementBar()

每次 myFoo 调用时,incrementBar 方法中的 bar 是否仍然为 0?即它永远不会达到 2,每次我调用 incrementBar 它都会对值 0 执行++ 操作。

最佳答案

您应该使用指针方法接收器,因为您要更改内部变量。 当您为 incrementBar 使用非指针方法接收器时,Foo 的一个实例被复制并传递给 incrementBar。改变 incrementBar 中的 self 不会改变 myFoo 的值,因为它只是一个副本。

这是一篇关于这个问题的好文章: http://nathanleclaire.com/blog/2014/08/09/dont-get-bitten-by-pointer-vs-non-pointer-method-receivers-in-golang/

关于go - 为什么我的结构中的变量不保持其值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36394778/

相关文章:

go - 向客户端发送多个响应

go - 从 stdin 读取空格分隔的整数到 int slice

go - 使用 Go 从 PEM 格式的 Google "oauth2/v1/certs"证书中提取公钥

sql - 在 Go 中初始化和保留准备好的语句的推荐方法是什么?

go - smtp.Dial ("ASPMX.L.GOOGLE.COM:25") 连接错误;但是腻子连接有效

go - 获取字符集字符串的编码器/解码器

ssl - 如何在 GO 中创建带有 ca 证书的 tls 客户端?

regex - 在 Go 正则表达式中转义括号

go - 附加到 []interface{} 问题——附加信息

golang 无法解析 json 项