ベストプラクティスに進む:ポインターまたは値のレシーバー?

構造体のメソッドを定義する際の一般的なジレンマ。

特にメソッドレシーバーを決定するときは、ポインターレシーバーまたはバリューレシーバーを使用する必要がありますか?

func (t *Type) Method() {} //pointer receiver

vs

func (t Type) Method() {} //value receiver

メソッドレシーバーは、その動作において関数引数に同化することができ、関数引数としてポインターまたは値を渡すことに適用できるすべてのものが、メソッドレシーバーにも適用されます。

いつポインターレシーバーを使用する必要がありますか

受信機を変更する

メソッドでレシーバーの状態を変更したい場合は、その値を操作して、ポインターレシーバーを使用する。値でコピーする値レシーバーでは不可能です。値レシーバーへの変更は、そのコピーに対してローカルです。

最適化

メソッドを定義している構造体が非常に大きい場合、それをコピーすると、値レシーバーを使用するよりもコストがかかりすぎます。

値レシーバーは、元のタイプ値のコピーを操作します。これは、特に構造体が非常に大きく、受け取ったポインタがより効率的である場合、コストがかかることを意味します。

バリューレシーバーが優れている場合

レシーバー値を編集する必要がない場合は、バリューレシーバーを使用する

バリューレシーバーは並行性に対して安全ですが、ポインタレシーバは並行性に安全ではありません

トレードオフを行う必要がある場合

通常は値レシーバーを使用するメソッドにポインターレシーバーを使用したい場合があります。それは、そのタイプで他のポインターレシーバーが定義されている場合です。一貫性すべてのメソッドでポインターレシーバーを使用する必要があります。

続きを読む


その他のチュートリアル: