ホームページ >バックエンド開発 >Golang >ポインターレシーバーを含む Go メソッドは、ポインター以外の変数に対して呼び出すことができますか?

ポインターレシーバーを含む Go メソッドは、ポインター以外の変数に対して呼び出すことができますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-01 16:22:10556ブラウズ

Can Go Methods with Pointer Receivers Be Called on Non-Pointer Variables?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。