構文の混乱を呼び出す Go レシーバー メソッド
Go プログラミング言語には、値レシーバーとポインター レシーバーという 2 種類のレシーバー メソッドが用意されています。値レシーバーは型の値を直接操作しますが、ポインター レシーバーは型の値へのポインターを操作します。
Go のドキュメントには、値メソッドはポインターと値の両方で呼び出すことができると記載されていますが、ポインターはメソッドはポインターに対してのみ呼び出すことができます。これは、ポインター メソッドがレシーバーを変更する可能性があり、値のコピーに対してポインター メソッドを呼び出すと、それらの変更が破棄されるためです。
ただし、提供されているコード例では、値に対してポインター メソッドを正常に呼び出します。これが有効である理由を理解するには、次の言語仕様を参照する必要があります。
A method call x.m() is valid if the method set of (the type of) x contains m and the argument list can be assigned to the parameter list of m. If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().
これは、変数がアドレス指定可能 (つまり、参照渡しできる) であれば、変数に対してポインタ メソッドを呼び出すことができることを意味します。まるでポインターであるかのように。コード例では、変数 vAge が値として宣言されていますが、名前付き型の変数であるため、アドレス指定可能です。したがって、vAge.Set(10) の呼び出しは (&vAge).Set(10) と同等であり、&vAge は vAge.
へのポインターであるため、これは有効です。以上が## Go で値に対してポインター レシーバー メソッドを呼び出すことができるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。