常にポインターレシーバーを使用するのではなく、値レシーバーを使用したい場合は、私には非常に不明確です。
ドキュメントから要約するには:
type T struct {
a int
}
func (tv T) Mv(a int) int { return 0 } // value receiver
func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver
ドキュメントは、「そのような基本的なタイプ、スライス、および小さな構造体などの種類については、値の受信機が非常に安くなっメソッドのセマンティクスは、ポインタを必要としない限り、値の受信機は、効率的かつ明確である。」また言います
最初のポイントは、それが「非常に安い」と述べていますが、問題は、ポインターレシーバーよりも安いということです。そこで、小さなベンチマーク(コードの要旨)を作成しました。これは、文字列フィールドが1つしかない構造体の場合でも、ポインターレシーバーの方が高速であることを示しています。これらは結果です:
// Struct one empty string property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 500000000 3.62 ns/op
// Struct one zero int property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 2000000000 0.36 ns/op
(編集:新しいgoバージョンでは2番目のポイントが無効になったことに注意してください。コメントを参照してください)。
二点目は、「効率的でクリアー」という味の問題ですね。個人的には、どこでも同じように使用することで一貫性を好みます。どのような意味で効率性?パフォーマンスに関しては、ほとんどの場合、ポインタの方が効率的です。1つのintプロパティを使用したいくつかのテスト実行では、Valueレシーバーの利点が最小であることが示されました(範囲は0.01〜0.1 ns / op)。
誰かが値レシーバーがポインターレシーバーよりも明らかに理にかなっている場合を教えてもらえますか?それとも、ベンチマークで何か間違ったことをしていますか?他の要素を見落としましたか?