指针类型的 Go 方法:使用指针类型的接收者 T 调用方法 *T
问题:
Go规范规定,指针类型T的方法集包含其对应类型T的方法集。这是否意味着我们可以在 T 类型的变量上调用接收者 T 的方法?
答案:
虽然规范建议这样做,但重要的是要注意,您不能直接在 T 上调用 *T 的方法。相反,编译器会自动将变量解引用到 &T 并调用该方法,从而有效执行 (&T).m().
此行为Go 规范中明确定义:
“调用:如果 x(的类型)的方法集包含 m 并且参数列表可以分配给 x 的参数列表,则方法调用 x.m() 有效。 m。如果x是可寻址的并且&x的方法集包含m,则x.m()是(&x).m()的简写。 "
演示:
以下示例说明了此行为:
package main import ( "fmt" "reflect" ) type User struct{} func (this *User) SayWat() { fmt.Println(reflect.TypeOf(this)) fmt.Println("WAT\n") } func main() { var user = User{} fmt.Println(reflect.TypeOf(user)) user.SayWat() }
尽管使用 *User 接收者声明了 SayWat 方法,但我们可以在 User 类型上调用它。编译器自动处理取消引用并调用 (&user).SayWat().
Exception:
但是,这仅适用于可寻址变量。如果尝试对不可寻址的值调用指针方法,将会遇到错误。例如:
func aUser() User { return User{} } ... aUser().SayWat() // Error: cannot call pointer method on aUser()上调用指针方法
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3