非指针类型上的指针方法解释
在 Go 中,约定规定可以在指针和值上调用值方法,而指针方法仅限于指针。然而,此规则的一个明显例外是能够对非指针值执行指针方法。
考虑以下代码片段:
package main import "fmt" type car struct { wheels int } func (c *car) fourWheels() { c.wheels = 4 } func main() { var c = car{} fmt.Println("Wheels:", c.wheels) c.fourWheels() // Here, a pointer method is invoked on a non-pointer value fmt.Println("Wheels:", c.wheels) }
代码成功执行了指针方法 fourWheels关于非指针值 c.这似乎与既定规则相矛盾。
实际上,当对非指针值 c 调用 fourWheels 方法时,您正在使用速记符号。表达式 c.fourWheels() 等价于 (&c).fourWheels()。
Go 规范指出:“如果 x 是可寻址的并且 &x 的方法集包含 m,则 x.m() 是 ( 的简写&x).m()."
换句话说,Go 隐式解引用非指针值 c 以获得指向它的指针,即然后用作指针方法的接收者。
为了澄清关于指针方法的规则,应该解释如下:
以上是为什么 Go 中可以对非指针值调用指针方法?的详细内容。更多信息请关注PHP中文网其他相关文章!