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,我刚刚看到了,并将其作为答案发布,哈哈!这是允许的,因为语言规范这么说。