首页 > 后端开发 > Golang > Go 的指针接收器方法可以在非指针变量上调用吗?

Go 的指针接收器方法可以在非指针变量上调用吗?

Barbara Streisand
发布: 2024-11-27 21:49:16
原创
961 人浏览过

Can Go's Pointer Receiver Methods Be Called on Non-Pointer Variables?

使用接收者 T 调用指针类型 *T 的方法

Go 编程语言规范规定任何类型 T 的方法集包含以下内容接收者类型为 T 的所有方法。但是,对应指针类型 T 的方法集是接收者为 T 的所有方法的集合或 T (包括 T 的方法集)。

这意味着我们可以在 T 类型的变量上调用带有 *T 类型接收者的方法,因为编译器隐式取消引用该变量来调用该方法。

为了验证这个概念,请考虑以下代码:

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

func (self *User) SayWat() {
    fmt.Println(self)
    fmt.Println(reflect.TypeOf(self))
    fmt.Println("WAT\n")
}

func main() {
    var user User = User{}

    fmt.Println(reflect.TypeOf(user), "\n")

    user.SayWat()
}
登录后复制

当我们运行此代码时,我们观察到可以调用 SayWat() 方法在用户变量上,即使该方法是使用指针接收器定义的。这是因为编译器会自动为我们取消引用该变量。

但是,需要注意的是,我们不能直接在 T 上调用 *T 的方法。例如,以下代码将失败并出现编译器错误:

func main() {
    var user User = User{}

    (&user).SayWat()
}
登录后复制

在这种情况下,编译器无法隐式取消引用该变量,因为 SayWat() 方法是使用指针接收器定义的。要调用该方法,我们必须使用 & 运算符显式取消引用该变量。

因此,虽然我们可以在 T 类型的变量上调用具有 T 类型接收者的方法,但我们不能调用直接T对T。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板