Function Golang-为什么我可以从值类型调用指针接收器方法?

Function Golang-为什么我可以从值类型调用指针接收器方法?,function,pointers,methods,go,Function,Pointers,Methods,Go,我又经历了一次,我对此感到困惑 简而言之,指定了类型顶点,以及带有指针接收器的函数 type Vertex struct { X, Y float64 } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } 不用担心。然而,我的困惑来自main函数,它似乎允许值类型调用指定指针接收器的方法 func main() { v := Vertex{3, 4} v.Scale(10) // v's

我又经历了一次,我对此感到困惑

简而言之,指定了类型
顶点
,以及带有指针接收器的函数

type Vertex struct {
  X, Y float64
}

func (v *Vertex) Scale(f float64) {
  v.X = v.X * f
  v.Y = v.Y * f
}
不用担心。然而,我的困惑来自main函数,它似乎允许值类型调用指定指针接收器的方法

func main() {
  v := Vertex{3, 4}
  v.Scale(10)
  // v's fields have changed
}
我检查了v型只是为了确定

fmt.Printf("v's type is %T\n", v)
// v's type is main.Vertex

为什么允许这样做?如果
v
不需要是一个指针来调用
Scale
方法,例如
v:=&Vertex{3,4}

来自同一教程,几张幻灯片后提供了一个解释:

在中,以下摘录提供了解释:

对于语句v.Scale(10),即使v是一个值而不是指针,也会自动调用带有指针接收器的方法。也就是说,为了方便起见,Go将语句v.Scale(10)解释为(&v).Scale(10),因为Scale方法具有指针接收器

func main() {
  v := Vertex{3, 4}
  v.Scale(10)
  // v's fields have changed
}

你在几张幻灯片后就有了答案:@T.Claverie,我刚刚看到了,并将其作为答案发布,哈哈!这是允许的,因为语言规范这么说。