调用用于带有对象的指针的方法
在 Go 中,可以使用对象而不是指向它的指针。这可能看起来不寻常,但根据 Go 规范,这是允许的。
考虑以下代码:
package main import "math" type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func main() { v := Vertex{3, 4} v.Scale(10) // v is not a pointer to a Vertex object fmt.Println(v.Abs()) }
在此示例中,v 是 Vertex 类型的对象,Scale 是用于指向 Vertex 的指针的方法。但是,我们没有传递指向 v 的指针,而是直接调用 v.Scale(10)。
为什么这不是错误?答案在于 Go 规范中定义的方法调用规则:
If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().
该规则规定,如果被调用的值是可寻址的(即,它是局部变量或指针),则调用其上的方法相当于调用其地址上的方法。在本例中,v 是局部变量,因此 v.Scale(10) 被解释为就好像我们写了 (&v).Scale(10) 一样。
这种便利使我们能够写得更干净、更简洁代码,而不必在调用方法之前显式创建指向对象的指针。但是,需要注意的是,这仅适用于具有指针接收器的方法。对于具有值接收器的方法,不允许传递指向对象的指针。
以上是为什么我可以使用对象而不是指针来调用带有指针接收器的 Go 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!