Language
receiver: value receiverはコピー、pointer receiverは元を更新する
value receiverの変更は呼び出し元へ残らず、pointer receiverの変更は元の値へ反映されます。
Sourcereceiver.go
Go 1.22
package methods
type Counter struct{ Value int }
func (c Counter) IncrementValue() { c.Value++ }
func (c *Counter) IncrementPointer() { c.Value++ }Testreceiver_test.go
Go 1.22
package methods
import "testing"
func TestValueReceiverはコピーを更新しpointerReceiverは呼び出し元を更新する(t *testing.T) {
counter := Counter{}
counter.IncrementValue()
if counter.Value != 0 {
t.Fatalf("value receiver changed counter: %d", counter.Value)
}
counter.IncrementPointer()
if counter.Value != 1 {
t.Fatalf("pointer receiver did not change counter: %d", counter.Value)
}
}01Assertion
このテストで確認できること
- value receiverはCounterのコピーを受け取る
- pointer receiverは呼び出し元のCounterを更新する
状態を更新するメソッドはpointer receiverを選びます。
OBSERVED RESULT
value receiver → 0
pointer receiver → 1