「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go はメソッド内のポインターと値のレシーバーをどのように処理しますか?

Go はメソッド内のポインターと値のレシーバーをどのように処理しますか?

2024 年 11 月 16 日に公開
ブラウズ:428

How Does Go Handle Pointer and Value Receivers in Methods?

Go ポインター: レシーバーと値の型

Go では、ポインターはオブジェクト指向プログラミングとメモリ管理を理解するために不可欠です。ポインターを扱うときは、メソッド内のレシーバーの型の区別を把握することが重要です。

あなたが提供した Go Tour の例は、この概念を示しています。

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X   v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Println(v.Abs())
}

ここで、Abs メソッドはポインタ レシーバ (*Vertex) を受け取ります。ただし、値レシーバー (Vertex) を使用しても同じ結果が得られることに気付きました。これはどのように可能ですか?

レシーバーと値の型

Go では派生メソッドが可能です。ポインター レシーバーを持つメソッドは、値レシーバーを持つメソッドを継承できます。これは、値レシーバー メソッド (例: 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) }  // GENERATED METHOD

自動アドレス取得

もう 1 つの重要な機能は Go の機能です。自動アドレス取得。明示的なポインター レシーバーのない次のコードを考えてみましょう。

func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X v.Y*v.Y) }
func main() {
    v := Vertex{3, 4}
    v.Abs()
}

Go は、Abs メソッドに渡された値のアドレスを暗黙的に取得します。これは次と同等です:

vp := &v
vp.Abs()

結論

Go では、レシーバー型の役割と自動アドレス取得機能を理解することが、ポインターを効率的に使用するために重要です。値レシーバー メソッドからポインター レシーバー メソッドを派生でき、Go は明示的にポインターを使用せずに自動的に値のアドレスを渡します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3