レシーバー T を使用したポインター型 *T のメソッドの呼び出し
Go プログラミング言語仕様では、任意の型 T のメソッド セットは以下で構成されると述べています。レシーバー型が T のすべてのメソッド。ただし、対応するポインター型 T のメソッド セットは、レシーバー型を持つすべてのメソッドのセットです。 T または T (T のメソッド セットを含む)。
これは、コンパイラが暗黙的に変数を逆参照するため、型 T の変数に対して型 *T のレシーバーを使用してメソッドを呼び出すことができることを意味します。メソッドを呼び出します。
この概念を検証するには、次のコードを検討してください。
package main import ( "fmt" "reflect" ) type User struct{} func (self *User) SayWat() { fmt.Println(self) fmt.Println(reflect.TypeOf(self)) fmt.Println("WAT\n") } func main() { var user User = User{} fmt.Println(reflect.TypeOf(user), "\n") user.SayWat() }
このコードを実行すると、 SayWat() メソッドは、ポインター レシーバーを使用して定義されている場合でも、ユーザー変数に対して呼び出すことができます。これは、コンパイラが自動的に変数を逆参照するためです。
ただし、T で *T のメソッドを直接呼び出すことはできないことに注意することが重要です。たとえば、次のコードはコンパイラ エラーで失敗します:
func main() { var user User = User{} (&user).SayWat() }
この場合、SayWat() メソッドがポインタ レシーバを使用して定義されているため、コンパイラは変数を暗黙的に逆参照できません。メソッドを呼び出すには、& 演算子を使用して変数を明示的に逆参照する必要があります。
したがって、型 T の変数に対して型 T のレシーバーを使用してメソッドを呼び出すことはできますが、次のメソッドを呼び出すことはできません。 T から T に直接。
以上がGo のポインター レシーバー メソッドは非ポインター変数に対して呼び出すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。