4

今日はGOツアーの仕事。構造体へのポインターに関連付けられたメソッドに構造体リテラルを渡したり、その逆を行ったりできることに気付きました。なぜこれが許可されているのですか?

package main

import (
    "fmt"
)

type Vertex struct {
    X, Y float64
}

func (v Vertex) Scale (f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func (v *Vertex) ScaleP(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func main() {
    v := &Vertex{3, 4}
    vLiteral := Vertex{3, 4}

    v.Scale(5)
    fmt.Println(v)

    v.ScaleP(5)
    fmt.Println(v)

    vLiteral.Scale(5)
    fmt.Println(vLiteral)

    vLiteral.ScaleP(5)
    fmt.Println(vLiteral)
}

出力:

&{3 4}
&{15 20}
{3 4}
{15 20}
4

1 に答える 1

5

メソッド セットを参照してください。

型には、関連付けられたメソッド セットがある場合があります (§インターフェース型、§メソッド宣言)。インターフェイス タイプのメソッド セットは、そのインターフェイスです。他の型 T のメソッド セットは、レシーバー型 T のすべてのメソッドで構成されます。対応するポインター型 *T のメソッド セットは、レシーバー *T または T を持つすべてのメソッドのセットです (つまり、次のメソッド セットも含まれます)。 T)。構造体型に関するセクションで説明されているように、無名フィールドを含む構造体にはさらに規則が適用されます。その他の型には空のメソッド セットがあります。メソッド セットでは、各メソッドに固有のメソッド名が必要です。

型のメソッド セットは、その型が実装するインターフェイスと、その型のレシーバーを使用して呼び出すことができるメソッドを決定します。

編集:

コールも参照してください。

メソッド呼び出し xm() は、x (の型) のメソッド セットに m が含まれ、引数リストを m のパラメーター リストに割り当てることができる場合に有効です。x がアドレス指定可能で、&x のメソッド セットに m が含まれている場合、xm() は (&x).m() の省略形です。

于 2013-02-17T22:48:08.757 に答える