type分三类
- 预声明标识类型,基本就是boolean,numeric and string
- 复合类型,如:map slice arry struct interface pointer function channel 这些使用(type字面量)构造的类型
自声明类型,分两种:
var Age int // 类型定义 var Int = int // 类型别名
类型定义,type: 一人千面
- 创建了一个完全新的类型,与其所基于的类型是两个不同的类型。
- 不继承底层类型的方法,但会继承底层类型的元素(如果是interface类型,那么其方法集也会保留下来,在我看interface的方法集实际上类似于字段)
- 类型别名,类型别名是给某个类型起的别名,该别名本质上依然是该类型。
底层类型,每一个type都有其底层类型,1和2类的底层类型都是其本身,3的底层类型视情况而定。
type ( A1 = string A2 = A1 ) type ( B1 string B2 B1 B3 []B1 B4 B3 )
A1,A2,B1,B2的底层类型都是string,B3,B4的底层类型都是[]B1
接口类型(interface type),推荐看Go接口深入解析
- 接口类型指定了一个方法集,这个方法集称之为该接口类型的接口(原话为:An interface type specifies a method set called its interface)
- 该方法集的所有方法名必须是唯一且不为空的
- 任何一个实现了该接口集的类型(即:该类型实现了所有该接口定义的方法集,可以多不能少)都可以作为该接口的变量来存储。即:该类型实现了该接口类型。
- 未初始化的接口变量是nil
- 某个类型可以实现多个接口类型
- 所有类型都实现了空接口
interface {}
,空接口可以用来做泛型。 - 内嵌接口:接口可以内嵌,包含接口包含了被包含接口所指定的方法集,但包含接口中不得再次定义已处于被包含接口指定的方法集中的方法
type ReadWriter interface { Read(b Buffer) int Write(b Buffer) int } type File interface { ReadWriter Close() }
结构体类型,结构体是命名元素的序列,我们称这些命名元素为字段,每个字段都有名字(name)和类型(type)。非空字段的名字必须唯一,字段可以显式或者隐式(一个字段只有type而没有名字)的指定。
- 隐式字段称为嵌入字段。嵌入字段要么是个类型,要么是个非接口类型的指针类型。
typt T struct { name string } type T1 struct { value int // 正常字段 int // 嵌入字段:int类型 *T // 嵌入字段:指向类型T的指针类型 }
- 如果一个 type T1 被嵌入另一个 type T 作为它的 filed,T1 的所有 field 和 method 都可以在 T 中使用
- 空结构体,重要的是其内存消耗等于0。