4

今天在旅途中工作。我注意到我可以将结构文字传递给与指向结构的指针关联的方法,反之亦然。为什么允许这样做?

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)。进一步的规则适用于包含匿名字段的结构,如结构类型部分所述。任何其他类型都有一个空方法集。在方法集中,每个方法必须具有唯一的方法名称。

类型的方法集决定了该类型实现的接口以及可以使用该类型的接收器调用的方法。

编辑:

另请参阅电话

如果 x 的(类型)的方法集包含 m 并且参数列表可以分配给 m 的参数列表,则方法调用 xm() 是有效的。如果 x 是可寻址的并且 &x 的方法集包含 m,则 xm() 是 (&x).m() 的简写:

于 2013-02-17T22:48:08.757 回答