为什么在Go中调用嵌入式字段的方法时,Type Alias和Type的行为会有所不同?

时间:2019-03-29 02:06:59

标签: go

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行:没关系

1 个答案:

答案 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