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

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

Patricia Arquette
Patricia Arquette原创
2024-12-01 16:22:10556浏览

Can Go Methods with Pointer Receivers Be Called on Non-Pointer Variables?

Go 中的简单类型可以调用指针类型的方法吗?

尽管 Go 规范声明该方法设置为 T 包含 T 的方法,关于是否可以在类型的变量上调用具有 T 接收器的方法会产生混淆T.

方法调用

问题的关键在于方法调用不限于使用指针接收器类型。编译器通过自动取消引用值来巧妙地处理方法调用,以获得所需的接收器类型。实际上,调用带有 *T 接收器的方法相当于调用 (&user).m(),其中 &user 检索变量的地址。

实际演示

考虑以下代码示例:

package main

import "fmt"

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.SayWat()
}

运行此代码后,您会注意到该方法即使用户不是指针类型,也会成功执行。这是因为编译器会自动取消引用用户来调用 SayWat 方法。

解决歧义

处理方法返回时会出现明确的区别。如果方法返回一个值,它将创建一个不可寻址的结果,无法使用点语法直接调用该结果。相反,显式使用“&”语法来获取返回值的地址。

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

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