非指针类型的指针方法
对上一个问题的回答指出指针方法只能在指针上调用。然而,这似乎是不正确的,如以下成功调用非指针值上的指针方法的代码所示:
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) }
解释
The理解这种行为的关键在于方法接收者是一个指针。当您调用 c.fourWheels() 时,接收者值 c 是一个非指针。但是,由于接收者类型是指针,因此这被解释为 (&c).fourWheels() 的简写。
根据 Go 规范,在调用方法时,如果接收者值是可寻址的并且接收者类型是指针,方法调用被解释为指针方法调用。在我们的例子中,接收器值 c 是可寻址的,并且接收器类型 *car 是一个指针,因此方法调用 c.fourWheels() 实际上是调用 (&c).fourWheels()。
此行为是与可以在指针和值上调用值方法,而只能在指针上调用指针方法的说法一致。对于指针方法,如果接收者值不是指针,则必须取消引用以获得可用作接收者的指针值。
以上是Go 中的非指针值可以调用指针方法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!