非指针值的指针方法调用
在 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() fmt.Println("Wheels:", c.wheels) }
表达式 c.fourWheels() 是 (&c) 的简写.fourWheels()。这是因为 fourWheels 的接收者是一个指针,而 c 是一个非指针值。由于 c 是可寻址的,编译器会自动取消引用它以获取指向 car 值的指针,然后将其用作接收者。
Go 规范中明确说明了此行为:
如果 x 是可寻址的并且 &x 的方法集包含 m,则 x.m() 是(&x).m().
因此,虽然有关指针方法的一般规则仍然有效,但自动指针取消引用允许在某些情况下方便地对非指针值调用指针方法。需要注意的是,此行为仅适用于具有指针接收器的方法。
以上是为什么 Go 中可以调用非指针值的指针方法?的详细内容。更多信息请关注PHP中文网其他相关文章!