使用接收者 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中文网其他相关文章!