去规范说:
任何其他类型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()
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/xMKuLzUbIf
我有点困惑.看起来我可以在T上调用"of*T"方法吗?我有一个更广泛的例子http://play.golang.org/p/RROPMj534A,这也让我感到困惑.是否有一些相反的类型推断?
我错过了什么,或者我的逻辑是不正确的?
谢谢!
你不能调用*Ton 方法T,但编译器足够智能,可以为你有效地调用变量的引用
(&user).SayWat()
Run Code Online (Sandbox Code Playgroud)
这在这里解释:
调用:如果方法集x(的类型)x包含m并且参数列表可以分配给m的参数列表,则方法调用xm()有效.如果x是可寻址的并且&x的方法集包含m,则xm()是(&x).m()的简写.
要了解差异,您可以获取返回值(不可寻址):
func aUser() User {
return User{}
}
...
aUser().SayWat()
Run Code Online (Sandbox Code Playgroud)
失败错误:
prog.go:40: cannot call pointer method on aUser()
prog.go:40: cannot take the address of aUser()
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/HOTKiiOK7S