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.

最后更新于