2017-06-29 17 views
0

は私が新しいキーパーを作成して、次の(を呼び出すときに、私はゴー関数ポインタの問題

func(l keeper) next() { 
    l.ptr++ 
} 

それに機能を追加します。しかし、構造体

type keeper struct { 
    ptr int32 
} 

を持っている)

tester := keeper { 
    ptr: 0, 
} 
test.next() 

私はテスター内のptr値を変更していないようです。関数をポインタに変更すると、それは動作します。

func(l *keeper) next() { 
    l.ptr++ 
} 

なぜそうですか?

+0

別の関連するQ&Aを参照してください:[https://stackoverflow.com/questions/27775376/value-receiver-vs-pointer-receiver-in-golang](https://stackoverflow.com/questions/27775376/value- receiver-vs-pointer-receiver-in-golang) – putu

答えて

0

Goでは、メソッドは型のインスタンスを受け取る関数です。関数が値としてインスタンスを受け取った場合、その値は本質的に関数のローカルになるインスタンスのコピーであり、そのインスタンスに対して行った突然変異は元のインスタンスには行われません。あなたの関数がインスタンスへのポインタを受け取った場合、あなたが行った突然変異は元のインスタンスに直接行われます。