首页 >后端开发 >Golang >Go 中的非指针值可以调用指针方法吗?

Go 中的非指针值可以调用指针方法吗?

Patricia Arquette
Patricia Arquette原创
2024-12-19 22:24:13585浏览

Can Pointer Methods Be Called on Non-Pointer Values in 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)
}

解释

The理解这种行为的关键在于方法接收者是一个指针。当您调用 c.fourWheels() 时,接收者值 c 是一个非指针。但是,由于接收者类型是指针,因此这被解释为 (&c).fourWheels() 的简写。

根据 Go 规范,在调用方法时,如果接收者值是可寻址的并且接收者类型是指针,方法调用被解释为指针方法调用。在我们的例子中,接收器值 c 是可寻址的,并且接收器类型 *car 是一个指针,因此方法调用 c.fourWheels() 实际上是调用 (&c).fourWheels()。

此行为是与可以在指针和值上调用值方法,而只能在指针上调用指针方法的说法一致。对于指针方法,如果接收者值不是指针,则必须取消引用以获得可用作接收者的指针值。

以上是Go 中的非指针值可以调用指针方法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn