Go basics:在结构上调用方法和在指向该结构的指针上调用方法之间有什么区别?

Go basics:在结构上调用方法和在指向该结构的指针上调用方法之间有什么区别?,go,Go,选择我有一个顶点类型 type Vertex struct { X, Y float64 } 我定义了一个方法 func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } 那两个电话有什么区别?(它们都返回相同的结果) 第一个版本相当于 var v1 Vertex v1.X = 3 v1.y = 4 fmt.Println((&v1).Abs) var v2 *Vertex v2 =

选择我有一个
顶点
类型

type Vertex struct {
    X, Y float64
}
我定义了一个方法

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
那两个电话有什么区别?(它们都返回相同的结果)


第一个版本相当于

var v1 Vertex
v1.X = 3
v1.y = 4
fmt.Println((&v1).Abs)
var v2 *Vertex
v2 = new(Vertex)
v2.X = 3
v2.y = 4
fmt.Println(v2.Abs)
第二个版本相当于

var v1 Vertex
v1.X = 3
v1.y = 4
fmt.Println((&v1).Abs)
var v2 *Vertex
v2 = new(Vertex)
v2.X = 3
v2.y = 4
fmt.Println(v2.Abs)

因此唯一的实质性区别是
v1
是一个值,
v2
是指向
Vertex
类型的值的指针。如果是这样,那么使用值和指向该值的指针之间没有区别?@tarsalah:当然,在一般情况下不是这样。例如,只能取消引用指针值,而不能取消引用普通值。讨论了自动地址获取:“与选择器一样,对使用指针的值接收器的非接口方法的引用将自动取消对该指针的引用:pt.Mv相当于(*pt.Mv)。”,“与方法调用一样,使用可寻址值的指针接收器对非接口方法的引用将自动采用该值的地址:t.Mv相当于(&t.Mv)。”感谢您的简明解释。