Go の単純型でポインター型のメソッドを呼び出すことはできますか?
Go の仕様では、 にメソッドが設定されていると記載されていますが、 T には T のメソッドが含まれており、T レシーバーを持つメソッドを型の変数で呼び出せるかどうかについて混乱が生じます。 T.
メソッド呼び出し
問題の核心は、メソッド呼び出しがポインター レシーバー型の使用に制限されていないことです。コンパイラーは、値を自動的に逆参照して目的のレシーバー型を取得することにより、メソッド呼び出しを巧みに処理します。実際には、*T レシーバーを持つメソッドの呼び出しは、(&user).m() の呼び出しと同等です。ここで、&user は変数のアドレスを取得します。
実践的なデモンストレーション
次のコード例を考えてみましょう:
package main import "fmt" 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.SayWat() }
このコードを実行すると、メソッドが実行されることがわかります。ユーザーがポインター型ではない場合でも、成功しました。これは、コンパイラがユーザーを自動的に逆参照して SayWat メソッドを呼び出すためです。
曖昧さへの対処
メソッドの戻り値を処理する場合、明確な区別が生じます。メソッドが値を返す場合、アドレス指定できない結果が作成され、ドット構文で直接呼び出すことはできません。代わりに、「&」構文を明示的に使用して戻り値のアドレスを取得します。
以上がポインターレシーバーを含む Go メソッドは、ポインター以外の変数に対して呼び出すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。