2016-04-04 9 views
0

は私が持っている場合:なぜ私の構造体の変数はその値を保持していませんか?

type Foo struct { 
    bar int 
} 

そしてFooの上で定義された方法は、(それに気づかない*はFooだけはFooです):

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

なぜフーを作り、二回メソッドを呼び出した後:

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

は、myFooが呼び出すたびにincrementBarメソッド内でbar still 0ですか?すなわち、2になることはありません。私がincrementBarを呼び出すたびに、値0で++演算を行います。

+2

重複:

は、ここで問題に関して良い記事です。ゴーゴーのツアーはこれをすべてうまく説明します。それを取る。 – Volker

答えて

5

内部変数を変更するので、ポインタメソッドレシーバーを使用してください。 incrementBarの非ポインタメソッド受信者を使用すると、Fooのインスタンスがコピーされ、incrementBarに渡されます。 selfincrementBarに変更すると、単なるコピーなので、値myFooは変更されません。 http://nathanleclaire.com/blog/2014/08/09/dont-get-bitten-by-pointer-vs-non-pointer-method-receivers-in-golang/

+0

しかし、それがポインター方式の受信機にならないようにするインタフェースがあればどうでしょうか?私が遵守しなければならないインターフェースは、私のメソッドがFooではなく* Fooであることが必要です。 –

+0

@AndrewArrowインターフェイスはこれを強制しません。ポインタを受信機として使用すると、**ポインタ**がインタフェースを実装するため、ポインタを受け取ることができます。あなたは 'Foo {}'の代わりに 'Foo {}'を渡します:) – nevets

+0

"GreenFooはColorFooを実装していません(バーメソッドはポインタレシーバを持っています)" –

関連する問題