Go spec说:
其他任何类型T的方法集都包含接收者类型T的所有方法。相应指针类型 T的方法集是接收者 T或T的所有方法的集合(也就是说,它还包含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() }
http://play.golang.org/p/xMKuLzUbIf
我有点困惑。看来我可以在T上调用方法“ of * T”?我有一个更广泛的示例http://play.golang.org/p/RROPMj534A,这也使我感到困惑。反之亦然有类型推断吗?
我是否缺少某些东西,或者我的逻辑不正确?
谢谢!
您不能调用*Ton 的方法T,但是编译器足够聪明,可以为您获取变量的引用,从而有效地调用
*T
T
(&user).SayWat()
这在这里解释:
调用:如果x的方法集包含m并且参数列表可以分配给m的参数列表,则方法调用xm()有效。如果x是可寻址的并且&x的方法集包含m,则xm()是(&x).m()的简写。
要了解差异,例如,您可以采用一个返回值(不可寻址):
func aUser() User { return User{} } ... aUser().SayWat()
失败并出现错误:
prog.go:40: cannot call pointer method on aUser() prog.go:40: cannot take the address of aUser()
http://play.golang.org/p/HOTKiiOK7S