ホームページ > バックエンド開発 > Golang > Go でポインター メソッドを非ポインター値に対して呼び出すことはできますか?

Go でポインター メソッドを非ポインター値に対して呼び出すことはできますか?

Patricia Arquette
リリース: 2024-12-19 22:24:13
オリジナル
540 人が閲覧しました

Can Pointer Methods Be Called on Non-Pointer Values in Go?

非ポインター型のポインター メソッド

前の質問に対する回答では、ポインター メソッドはポインターでのみ呼び出すことができると述べています。ただし、これは、非ポインター値に対してポインター メソッドを正常に呼び出す次のコードで示されているように、間違っているようです。この動作を理解する鍵は、メソッド レシーバーがポインターであるという事実にあります。 c.fourWheels() を呼び出すと、レシーバーの値 c は非ポインターになります。ただし、レシーバーの型はポインターであるため、これは (&c).fourWheels() の短縮形として解釈されます。

package main

import "fmt"

type car struct {
    wheels int
}

func (c *car) fourWheels() {
    c.wheels = 4
}

func main() {
    var c = car{}
    fmt.Println("Wheels:", c.wheels)
    c.fourWheels()
    fmt.Println("Wheels:", c.wheels)
}
ログイン後にコピー
Go の仕様によれば、メソッドを呼び出すとき、レシーバーの値がアドレス指定可能であり、レシーバーの型がポインターの場合、メソッド呼び出しはポインター メソッド呼び出しとして解釈されます。この場合、レシーバーの値 c はアドレス指定可能で、レシーバーの型 *car はポインターであるため、メソッド呼び出し c.fourWheels() は事実上 (&c).fourWheels() を呼び出しています。

この動作は次のとおりです。これは、値メソッドはポインターと値に対して呼び出すことができるが、ポインター メソッドはポインターに対してのみ呼び出すことができるという記述と一致します。ポインター メソッドの場合、レシーバーの値がポインターでない場合は、レシーバーとして使用できるポインター値を取得するために逆参照する必要があります。

以上がGo でポインター メソッドを非ポインター値に対して呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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