使用对象与指针接收器的方法调用
在 Go 中,可以为具有值接收器(非指针)或指针的类型定义方法接收器(指针)。当对象调用带有指针接收器的方法时,Go 会自动解释该调用,就好像它是在指向该对象的指针上进行的一样。
例如,请考虑以下代码:
package main import ( "fmt" "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) // Calling a method with a pointer receiver using an object fmt.Println(v.Abs()) }
这里,我们有一个 Vertex 类型,具有值和指针接收器方法。在 main 函数中,我们创建一个 Vertex 对象 v,然后调用它的 Scale 方法。通常,Scale 方法需要一个指针接收器,但在本例中,我们使用的是一个对象。
编译器注意到 v 是可寻址的,并且它的方法集包括 Scale。根据 Go 规范:
“如果 x(的类型)的方法集包含 m 并且参数列表可以分配给 m 的参数列表,则方法调用 x.m() 是有效的。如果 x是可寻址的,并且 &x 的方法集包含 m,x.m() 是 (&x).m() 的简写。”
因此,调用 v.Scale(10) 被解释为(&v).Scale(10),它有效地将指向 v 对象的指针传递给 Scale 方法。这允许该方法按预期修改对象的 X 和 Y 字段。
以上是当方法具有指针接收器时,Go 如何处理对象接收器的方法调用?的详细内容。更多信息请关注PHP中文网其他相关文章!