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