Go 语言类型元信息的通用结构 _type
-
_type 数据结构
-
Go 语言是一种强类型的语言,编译器在编译时会做严格的类型校验
-
所以 Go 语言必然为每种类型维护一个类型的元信息
-
这个元信息在运行和反射时都会用到
-
其他类型都是以 _type 为内嵌字段封装而成的结构体
-
type _type struct{ size uintptr // 大小 ptrdata uintptr // size of memory prefix holding all pointers hash uint32 // 类型 Hash tflag tflag // 类型的特征标记 align uint8 // _type 作为整体变量存放时的对齐字节数 fieldalign uint8 // 当前结构字段的对齐字节数 kind uint8 // 基础类型枚举值和反射中的 Kind 一致,kind 决定了如何解析该类型 alg *typeAlg // 指向一个函数指针表,该表有两个函数,一个是计算类型 Hash 函数。另一个是比较两个类型是否相同的 equal 函数 gcdata *byte // GC 相关 str nameOff // str 用来表示类型名称字符串在编译后二进制文件中某个 section、 的偏移量 ptrToThis typeOff // ptrToThis 用来表示类型元信息的指针在编译后二进制文件中某个section 偏移量,有连接器负责填充 }
-
_type 包含所有类型的共同元信息,编译器和运行时可以根据该元信息解析具体类型、类型名存放的位置、类型的 Hash 值等基本信息
-
-
-
注意:
-
Go 语言类型元信息最初由编译器负责构建,并以表的形式存放在编译后的对象文件中,在由连接器在连接是进行段合并、符号重定向(填充某些信息)。这些类型信息在接口的动态调用和反射中被运行时引用
-
接下来看一下接口的类型元信息的数据结构,实例如下:
-
// 描述接口的类型 type interfacetype struct { typ _type // 类型通用部分 pkgpath name // 接口所属包的名字信息, name 内存放的不仅有名称,还有描述信息 mhdr []imethod //接口的方法 } // 接口方法元信息 type imethod struct { name nameOff // 方法名在编译后的 section 里面的偏移量 itype typeOff // 方法类型在编译后的 section 里面的偏移量 }
-
-