ポインター型の Go メソッド: ポインター型 *T のレシーバー T を使用したメソッドの呼び出し
質問:
Go の仕様では、ポインタ型のメソッド セットは次のように規定されています。 T には、対応する型 T のメソッド セットが含まれています。これは、型 T の変数に対してレシーバー T を使用してメソッドを呼び出すことができるという意味ですか?
答え:
仕様ではこれを示唆していますが、T で *T のメソッドを直接呼び出すことはできないことに注意することが重要です。代わりに、コンパイラは自動的に変数を &T に逆参照します。そしてメソッドを呼び出し、(&T).m() を効果的に実行します。
この動作は Go 仕様で明示的に定義されています。
"Calls: メソッド呼び出し x.m() は、 x (の型) のメソッド セットに m が含まれており、引数リストを m のパラメータ リストに割り当てることができます。x がアドレス指定可能で、&x のメソッド セットに m が含まれている場合、x.m() は次のようになります。 (&x).m() の短縮形。「
デモ:
次の例は、この動作を示しています。
package main import ( "fmt" "reflect" ) type User struct{} func (this *User) SayWat() { fmt.Println(reflect.TypeOf(this)) fmt.Println("WAT\n") } func main() { var user = User{} fmt.Println(reflect.TypeOf(user)) user.SayWat() }
*User のレシーバーを持つ SayWat メソッドを使用すると、タイプが User のユーザーに対して呼び出すことができます。コンパイラは自動的に逆参照を処理し、(&user).SayWat().
Exception:
を呼び出します。ただし、これはアドレス可能な変数にのみ適用されます。アドレス指定できない値に対してポインター メソッドを呼び出そうとすると、エラーが発生します。例:
func aUser() User { return User{} } ... aUser().SayWat() // Error: cannot call pointer method on aUser()
以上がレシーバー型 `T` の Go メソッドは型 `*T` の変数で呼び出すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。