非ポインター型のポインター メソッドの説明
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 サイトの他の関連記事を参照してください。