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 }