ホームページ >バックエンド開発 >Golang >なぜ Go ではポインター以外の値に対してポインター メソッドを呼び出すことができるのでしょうか?

なぜ Go ではポインター以外の値に対してポインター メソッドを呼び出すことができるのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-27 11:49:11776ブラウズ

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

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

Go では、規則により、値メソッドはポインターと値の両方で呼び出すことができると規定されています。一方、ポインター メソッドはポインターに限定されます。ただし、このルールの明らかな例外は、非ポインター値に対してポインター メソッドを実行できることです。

次のコード スニペットを考えてみましょう。

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()
    // Here, a pointer method is invoked on a non-pointer value
    fmt.Println("Wheels:", c.wheels)
}

このコードは、ポインター メソッド fourWheels を正常に実行します。非ポインタ値について c.これは確立されたルールと矛盾しているように思えるかもしれません。

実際には、非ポインター値 c に対して fourWheels メソッドを呼び出すときは、短縮記法を使用しています。式 c.fourWheels() は、(&c).fourWheels() と同等です。

Go 仕様では、「x がアドレス可能で、&x のメソッド セットに m が含まれる場合、x.m() は ( &x).m()."

言い換えると、Go は非ポインター値 c を暗黙的に逆参照して、それへのポインター。ポインター メソッドのレシーバーとして使用されます。

ポインター メソッドに関する規則を明確にするために、次のように解釈する必要があります。

  • 値メソッドは次のように解釈できます。値とポインターの両方で呼び出されます。
  • ポインター メソッドは、ポインター、および場合によっては非ポインター値でも呼び出すことができますが、ポインター以外の値には、ポインターを介して間接的にアクセスできます。

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

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