Go における値レシーバーとポインター レシーバーのメソッド: 設計と理論的根拠を理解する
Go では、メソッドは次のいずれかを使用して定義できます。値レシーバー (T) またはポインター レシーバー (T)。 T で定義されたメソッドは T のコピーに影響を与えることができますが、T で定義されたメソッドは T によって参照される実際のデータに影響を与えます。
値レシーバーのメソッドがポインター レシーバーでも使用できる理由
T で定義されたメソッドは、関数に引数を渡すときに Go が自動的にポインタを参照解除するため、T で使用できます。たとえば、int:
<code class="go">func (n *int) Add(x int) { *n += x }</code>
でメソッドが定義されている場合、*int と int の両方でこのメソッドを呼び出すことができます:
<code class="go">var n int ptr := &n ptr.Add(5) // Call Add on *int n.Add(5) // Automatically dereferences ptr when calling Add on int</code>
メソッドの理由on ポインター レシーバーは値レシーバーでは使用できません
*T で定義されたメソッドは T では使用できません。これは、Go が関数に引数を渡すときに自動的に値を参照しないためです。値へのポインタを作成するには、& 演算子を使用してそのアドレスを明示的に取得する必要があります:
<code class="go">var n int ptr := &n</code>
ただし、これが常に可能であるとは限りません。たとえば、T がマップに格納されている場合、または関数から返された場合、そのアドレスは静的またはアクセスできない可能性があります。
設計の長所と短所
これこの設計にはいくつかの利点があります:
ただし、これには欠点もあります:
以上がGo のポインターでは値レシーバー メソッドが使用できるのに、その逆はなぜ使用できないのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。