非ポインター型のポインター メソッド
前の質問に対する回答では、ポインター メソッドはポインターでのみ呼び出すことができると述べています。ただし、これは、非ポインター値に対してポインター メソッドを正常に呼び出す次のコードで示されているように、間違っているようです。この動作を理解する鍵は、メソッド レシーバーがポインターであるという事実にあります。 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 でポインター メソッドを非ポインター値に対して呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。