【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 *itabdata unsafe.Pointer}
type itab struct { inter *interfacetype _type *_type hash uint32 _ [4]byte fun [1]uintptr }type interfacetype struct {typ _typepkgpath namemhdr []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)
