Go ツアーの演習 51 では、次のメソッドが使用されると述べられています。ポインタ レシーバは、渡される値に影響を与えません。ただし、メソッドに渡される変数に値を割り当てる場合、この動作は観察されません。
この矛盾を理解するには、Go では、メソッド呼び出し x.m() が有効であることを認識することが重要です。 x の型のメソッド セットには m が含まれており、引数リストは m のパラメータ リストに割り当てることができます。重要なのは、x がアドレス指定可能で、&x のメソッド セットに m が含まれている場合、x.m() は実質的に (&x).m() の短縮形になります。
ポインタ レシーバを持つメソッドが値に対して呼び出されるとき、コンパイラは値への一時ポインタを自動的に作成し、そのポインタをメソッドに渡します。これが行われるのは、メソッドが実際に変数自体ではなく、変数へのポインターを操作するためです。したがって、メソッドに渡される変数が値であっても、メソッドはポインタを受け取り、それに応じて値を変更できます。
この「魔法」は、Go の型システムとメソッド セットの結果です。強力な型付けを維持しながら、簡潔で効率的なコードを実現します。
以上がポインター レシーバーを使用した Go メソッドで値の引数を変更できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。