ホームページ > バックエンド開発 > Golang > レシーバー型 `T` の Go メソッドは型 `*T` の変数で呼び出すことができますか?

レシーバー型 `T` の Go メソッドは型 `*T` の変数で呼び出すことができますか?

Mary-Kate Olsen
リリース: 2024-11-17 18:27:02
オリジナル
654 人が閲覧しました

Can Go Methods with Receiver Type `T` Be Called on Variables of Type `*T`?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート