Go レシーバー メソッド呼び出し構文の混乱
Effective Go のドキュメントでは、ポインター メソッドは値ではなくポインターに対してのみ呼び出すことができると主張しています。しかし、最近の実験ではこの概念に疑問を投げかけています。
値型で vAge.Set(10) を呼び出すと、コードは正常にコンパイルされます。これはドキュメントと矛盾しているようです。コードが間違っているのか、それともドキュメントに誤解があるのか?
答えはアドレス指定可能性にあります。 Go 言語仕様では、メソッドが値の型で定義され、引数をメソッドのパラメーターに割り当てることができる場合、値に対するメソッド呼び出しが有効であることを明確にしています。
値がアドレス指定可能な場合は、値を指定できます。逆参照して、基になる型へのポインターを取得します。この場合、vAge はポインタ演算子 (&) をサポートする型 (age) の値であるため、アドレス指定可能です。
したがって、vAge.Set(10) は (&vAge).Set( 10)、(&vAge) が age 型へのポインターであるため、これは有効です。このポインターに対してポインター メソッド Set を呼び出すことができ、レシーバーの変更が可能になります。
言語のこの微妙な点により、Go の値の型は、ドキュメントからはすぐには明らかではない方法で動作することができます。潜在的な誤解を避けるために言語仕様を理解することの重要性を強調しています。
以上が**Go 値型はポインター メソッドを呼び出すことができますか?アドレス指定可能性とメソッド呼び出しの概要**の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。