Links

4.4.4-7 Named 类型

Named 结构用来表示 Defined Types, 即通过语法结构type A β或者type A = β定义的类型,其中 β 表示任何合法的表达式,例如如果 β 表示struct {...}, 则整个声明就是一个 struct 结构体。
type A = β叫着类型别名,是 go 1.9 引入的语法,通常情况下这种用法中 β 都是一个具体的类型名字,假设为 B,则此时 A 与 B 完全是一样的类型,纯粹只是为类型 B 引入一个别名。可以参考Russ Cos 的文章了解使用场景。
type A β则会创建一个新的类型,A 的 underlying type 是 β 所表示的类型, 例如如果 β 表示struct {...} , 则其类型就是上文提到的 Struct 类型;如果 β 是一个具体的类型名字,例如 C, 那么 A 的 underlying type 就是 C. 后面有专门的章节讨论Underlying Type.
Named结构定义如下:
type Named struct {
check *Checker // for Named.under implementation
info typeInfo
obj *TypeName // corresponding declared object
orig Type // type (on RHS of declaration) this *Named type is derived of (for cycle reporting)
underlying Type // possibly a *Named during setup; never a *Named once set up completely
tparams []*TypeName // 类型参数名字,用于泛型
targs []Type // 类型参数的限定类型(constraint)
methods []*Func // 与该类型绑定的方法
}
check 是类型检查器的数据结构,详细介绍在Checker, 字段info在后期用于类型的循环依赖检查. 每种类型都必须实现Underlying() Type方法(见Type 接口),其他所有类型的该方法都是返回自身,只有 Named 类型是返回属性underlying.