Go 语言类型元信息的通用结构 _type

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 里面的偏移量
        }
        
原文地址:https://www.cnblogs.com/jcjc/p/12511828.html