从实现上来讲,golang有两种类型的interface: iface和eface.
实现的代码在
type iface struct {
tab *itab //见itab说明
data unsafe.Pointer //指向数据存储的地方
}
type eface struct {
_type *_type
data unsafe.Pointer
}
type itab struct {
inter *interfacetype //interface的类型
_type *_type //实际运行中赋值的变量的类型
hash uint32 // copy of _type.hash. Used for type switches.
_ [4]byte
fun [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.
}
从代码实现上来看, eface只是包含类型信息和指向数据的指针。iface还包括了函数集等信息。
反汇编iface空接口实现代码
package main
import "fmt"
func main() {
var i interface{}
var num int = 128
i=num
fmt.Println(i)
}
反汇编后对应的汇编代码