Go レシーバー メソッド呼び出し構文: 詳しい説明
「Effective Go」ガイドでは、ポインター メソッドは値メソッドはポインターに対して呼び出すことができますが、値メソッドはポインターまたは値に対して呼び出すことができます。しかし、最近遭遇した問題により、次のコードで値がポインタ メソッドを呼び出すのはなぜですか?
<code class="go">package main import ( "fmt" ) type age int func (a age) String() string { return fmt.Sprintf("%d yeasr(s) old", int(a)) } func (a *age) Set(newAge int) { if newAge >= 0 { *a = age(newAge) } } func main() { var vAge age = 5 pAge := new(age) vAge.Set(10) // Compilation successful }</code>
これを解決するために、Go 言語仕様に目を向けます。 「呼び出し」の下に、次のように書かれています:
x (の型) のメソッド セットに m が含まれており、引数リストを m のパラメータ リストに割り当てることができる場合、メソッド呼び出し x.m() は有効です。 x がアドレス可能で、&x のメソッド セットに m が含まれている場合、x.m() は (&x).m() の短縮形です。
この場合、vAge はアドレス可能です (*age への型変換は有効です)。 vAge.Set(10) は本質的には (&vAge).Set(10) です。 Set() の受信側の型はポインターであるため、値 vAge はポインター メソッド Set() を呼び出すことができます。
以上が## Go で値がポインタ メソッドを呼び出せるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。