方法接收器模糊

SCh*_*ang 3 go

今天去旅游.我注意到我可以将struct literals传递给与指向结构的指针相关联的方法,反之亦然.为什么允许这样做?

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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

&{3 4}
&{15 20}
{3 4}
{15 20}
Run Code Online (Sandbox Code Playgroud)

zzz*_*zzz 5

请参见方法集:

类型可以具有与之关联的方法集(§接口类型,§方法声明).接口类型的方法集是其接口.任何其他类型T的方法集由接收器类型T的所有方法组成.相应指针类型*T的方法集是具有接收器*T或T的所有方法的集合(即,它还包含方法集T).其他规则适用于包含匿名字段的结构,如结构类型一节中所述.任何其他类型都有一个空方法集.在方法集中,每个方法必须具有唯一的方法名称.

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

编辑:

另见电话:

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