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中文网其他相关文章!