我们说我已经定义了这个结构:
type Vertex struct {
X, Y float64
}
现在它完全合法去使用它:
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs())
}
但也可以不使用指针:
func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs())
}
两种情况下的结果是相同的,但它们在内部有何不同?指针的使用是否使程序运行得更快?
PS。我知道Abs()
函数需要一个指针作为接收器。这解释了之后在主函数中使用指针的原因。但是,当我不使用指针直接在结构实例上调用Abs()
时,为什么程序没有发出错误?
答案 0 :(得分:3)
为什么当我不使用指针并直接在结构实例上调用
Abs()
时,程序不会发出错误?
因为你可以得到一个结构实例的(地址)指针。
如“What do the terms pointer receiver and value receiver mean in Golang?”
中所述Go会自动解析和自动取消引用指针(在大多数情况下),因此
m := MyStruct{}; m.DoOtherStuff()
仍可正常工作,因为Go会自动为您(&m).DoOtherStuff()
。
如“Don't Get Bitten by Pointer vs Non-Pointer Method Receivers in Golang”或“Go 101: Methods on Pointers vs. Values”所示,使用指针接收器(v *Vertex)
非常适合避免复制,因为Go passes everything by value。
spec mentions (Method values):
与method calls一样,对使用可寻址值的指针接收器的非接口方法的引用将自动获取该值的地址:
t.Mp
等效于(&t).Mp
。