非ポインター値でのポインター メソッドの呼び出し
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() fmt.Println("Wheels:", c.wheels) }
式 c.fourWheels() は (&c) の短縮形です。 .fourWheels()。これは、fourWheels の受信側がポインターであり、c が非ポインター値であるためです。 c はアドレス指定可能であるため、コンパイラは自動的に c を逆参照して car 値へのポインタを取得し、それがレシーバとして使用されます。
この動作は Go 仕様で明示的に述べられています。
x がアドレス指定可能で、&x のメソッドセットに m が含まれている場合、x.m() は次の短縮形です。 (&x).m().
したがって、ポインター メソッドに関する一般規則は引き続き有効ですが、自動ポインター参照解除により、特定の状況で非ポインター値に対してポインター メソッドを簡単に呼び出すことができます。この動作はポインター レシーバーを持つメソッドにのみ適用されることに注意することが重要です。
以上がGo で非ポインター値に対してポインター メソッドを呼び出すことができるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。