Go のツアーでは、ポインターは値のメソッドを実装するために使用されると述べられています。しかし、非ポインタ レシーバを使用してメソッドを宣言し、それをポインタ値で使用しようとした場合、またはその逆の場合はどうなるでしょうか?
その答えは、Go 言語の 2 つの基本的なルールにあります。
メソッドの派生:
Go を使用すると、既存のメソッドからメソッドを派生できます。あなたの例では、メソッド func (v Vertex) Abs() float64 はメソッド func (v *Vertex) Abs() float64 から派生しています。これは、前のメソッドを宣言すると、新しい実装が自動的に生成されることを意味します。この実装は基本的に、レシーバーへのポインターを使用して元のメソッドを呼び出します。
func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) } func (v Vertex) Abs() float64 { return Vertex.Abs(*v) } // Automatically generated
したがって、 func (v * ) を宣言するかどうかに関係なく、 Vertex) Abs() または func (v Vertex) Abs()、どちらの場合も、生成されたメソッドが呼び出されます。
自動アドレス取得:
Go はポインターを自動的に生成できます変数に。次の場合、式 v.Abs() は次のコードに解決されます。
vp := &v vp.Abs()
これは、ポインターを期待するメソッドに値を渡すと、Go がメソッドを自動的に派生させることができないことを意味します。既存のものの場合、コンパイラは値へのポインタを生成し、そのポインタでメソッドを呼び出します。
要約すると、Go は次の規則に従ってポインタとメソッドを処理します。
以上が受信側の型と値の型が一致しない場合、Go はメソッドとポインターをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。