假设我已经定义了这个结构:
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()
结构实例时,为什么程序不会吐出错误?
当我不使用指针并直接调用
Abs()
结构实例时,为什么程序不会吐出错误?
因为您可以获得指向结构实例(的地址)的指针。
如“ Golang中的指针接收器和值接收器这两个术语是什么意思”一节所述。
Go会自动寻址和自动取消引用指针(在大多数情况下),因此
m := MyStruct{}; m.DoOtherStuff()
Go仍然有效,因为Go会自动(&m).DoOtherStuff()
为您服务。
如“在Golang中不要被指针vs非指针方法接收器咬住”或“ Go 101:指针与值的方法”所说明的那样,使用指针接收器(v *Vertex)
可以避免复制,因为Go会按值传递所有内容。
与方法调用一样,使用可寻址值的指针接收器对非接口方法的引用将自动采用该值的地址:
t.Mp
等效于(&t).Mp
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句