受信側の型と値の型が一致しない場合、Go はメソッドとポインターをどのように処理しますか?

Barbara Streisand
リリース: 2024-11-09 04:08:01
オリジナル
450 人が閲覧しました

How does Go handle methods and pointers when the receiver type and the value type don't match?

Golang のポインター: 包括的な説明

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 が既存のメソッドから自動的にメソッドを派生できない場合は、値へのポインタを生成し、そのポインタでメソッドを呼び出します。

以上が受信側の型と値の型が一致しない場合、Go はメソッドとポインターをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート