zoukankan      html  css  js  c++  java
  • 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 里面的偏移量
          }
          
  • 相关阅读:
    【Android】详解Android 网络操作
    【Android】详解Android Service
    【Android】Android的进程优先级
    【Windows】Dos中的日期的和时间
    【Android】详解Android Activity
    【Java】java数据库连接中C3P、DBCP、Druid连接池的使用
    【Windows】Windows中解析DOS的DIR命令使用
    【Android】解析Android的路径
    【Windows】Windows中解析DOS的for命令使用
    【Android】Android实现监听返回键,主键(HOME),菜单键
  • 原文地址:https://www.cnblogs.com/jcjc/p/12511828.html
Copyright © 2011-2022 走看看