github.com/tencent/goom@v1.0.1/internal/hack/iface.go (about)

     1  // Package hack 对 go 系统包的 hack, 包含一些系统结构体的 copy,需要和每个 go 版本保持同步
     2  package hack
     3  
     4  import "unsafe"
     5  
     6  const (
     7  	// MaxMethod 支持类型的最大方法数量
     8  	MaxMethod = 999
     9  )
    10  
    11  // Iface 接口结构
    12  // TODO 不同 go 版本兼容
    13  type Iface struct {
    14  	// Tab 为接口类型的方法表
    15  	Tab *Itab
    16  	// Data 为接口变量所持有的对实现类型接收体的地址
    17  	Data unsafe.Pointer
    18  }
    19  
    20  // Itab keeps sync with runtime.itab
    21  // TODO 不同 go 版本兼容
    22  // 注意: 最多兼容99个方法数量以内的接口
    23  type Itab struct {
    24  	// nolint
    25  	Inter *uintptr
    26  	// nolint
    27  	Type *uintptr
    28  	// nolint
    29  	hash uint32 // copy of Type.hash. Used for type switches.
    30  	_    [4]byte
    31  	// Fun 为方法表映射、排序同接口方法定义的顺序
    32  	Fun [MaxMethod]uintptr // variable sized. fun[0]==0 means Type does not implement Inter.
    33  }
    34  
    35  // Eface 接口结构
    36  type Eface struct {
    37  	// nolint
    38  	rtype unsafe.Pointer
    39  	// Data 为 interface{}类型变量指向的 Iface 类型变量的地址
    40  	Data unsafe.Pointer
    41  }
    42  
    43  // UnpackEFace 取出接口对象
    44  func UnpackEFace(obj interface{}) *Eface {
    45  	return (*Eface)(unsafe.Pointer(&obj))
    46  }