go版本go1.11.2 linux / amd64
https://play.golang.org/p/kTvcsWkJeaZ
package main
type T1 struct {
}
func (T1) Hello(T1) {
}
type T2 struct {
T1
}
func (T2) Hello(T2) {
}
type T3 T2
type T4 = T2
func main() {
var v_T3 T3
v_T3.Hello(v_T3)
var v_T4 T4
v_T4.Hello(v_T4)
}
prog.go:21:12: cannot use v_T3 (type T3) as type T1 in argument to v_T3.T1.Hello
第21行:我希望打v_T3.Hello
,但实际打v_T3.T1.Hello
第23行:没关系
答案 0 :(得分:1)
type T4 = T2
这为现有类型T2赋予了附加名称T4。它没有引入新的类型。换句话说,T2和T4始终是可互换的。那应该解释为什么v_T4.Hello(v_T4)
调用起作用。以下所有调用在类型方面都是同义词(但忽略v_T2和v_T4是不同的值):
var v_T2 T2
var v_T4 T4
v_T2.Hello(v_T2)
v_T2.Hello(v_T4)
v_T4.Hello(v_T2)
v_T4.Hello(v_T4)
type T3 T2
这定义了不同于所有其他类型的新类型T3。根据类型规则,T3 doesn't inherit T2's methods。但是因为它们具有相同的基础类型,所以T3和T2的字段是相同的,包括嵌入式T1。反过来promotes T1's methods to T3。