首页 文章

Golang - 为什么我可以从值类型中调用指针接收器方法? [重复]

提问于
浏览
1

这个问题在这里已有答案:

我再次经历Tour of Go,我对此感到困惑Methods Module

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

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}

1 回答

  • 2

    从同一个教程中,稍后会提供一些说明:

    Methods and pointer indirection slide中,以下摘录提供了解释:

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

相关问题