【Golang】图解Interface
“ 被动态值、动态类型整的晕头转向?还不快来认识下接口~”
01
—
空接口interface{}
type eface struct {
_type *_type
data unsafe.Pointer
}
var e interface{}
图:e赋值前
f, _ := os.Open('eggo.txt')
e = f
02
—
非空接口
type iface struct {
tab *itab
data unsafe.Pointer
}
type itab struct {
inter *interfacetype
_type *_type
hash uint32
_ [4]byte
fun [1]uintptr
}
type interfacetype struct {
typ _type
pkgpath name
mhdr []imethod
}
- itab.hash是从itab._type中拷贝来的,是类型的哈希值,用于快速判断类型是否相等时使用。
- itab.fun记录的是动态类型实现的那些接口要求的方法的地址,是从方法元数据中拷贝来的,为的是快速定位到方法。如果itab._type对应的类型没有实现这个接口,则itab.fun[0]=0,这在类型断言时会用到。
03
—
非空接口赋值前后
var rw io.ReadWriter
f, _ := os.Open('eggo.txt')
rw = f
var w io.Writer = f
04
—
itab缓存
type itabTableType struct {
size uintptr // length of entries array. Always a power of 2.
count uintptr // current number of filled entries.
entries [itabInitSize]*itab // really [size] large
}
func itabHashFunc(inter *interfacetype, typ *_type) uintptr {
return uintptr(inter.typ.hash ^ typ.hash)
}
赞 (0)