如果我有:
type Foo struct {
bar int
}
在Foo上定义的方法(注意它不是* Foo,只是Foo):
func (self Foo)incrementBar() {
self.bar++
}
为什么在制作Foo并调用该方法两次之后:
myFoo := Foo{}
myFoo.incrementBar()
myFoo.incrementBar()
每次myFoo调用它时,在incrementBar方法中仍为0吗?即它永远不会达到2,每次调用incrementBar时它都会对值0进行++操作。
答案 0 :(得分:5)
您应该使用指针方法接收器,因为您正在改变内部变量。
当您为incrementBar
使用非指针方法接收器时,会复制Foo
的实例并将其传递给incrementBar
。在self
中更改incrementBar
不会更改myFoo
的值,因为它只是副本。
这是一篇关于这个问题的好文章: http://nathanleclaire.com/blog/2014/08/09/dont-get-bitten-by-pointer-vs-non-pointer-method-receivers-in-golang/