interface空指针不为nil
当把一个空指针对象赋值给一个interface后,
var pi *int = nil
var i interface{}
i = pi
fmt.Println(i == nil) // 结果为 false
i = pi
type iface struct {
tab *itab
data unsafe.Pointer
}
type eface struct {
_type *_type
data unsafe.Pointer
}
i = pii.data = unsafe.Pointer(&pi)i == nili.data == nil
判断interface里的指针是否为空
那么,现在的问题是,如何判断interface里的指针是否为空呢?
ai, ok := i.(*int)ai == nilvi := reflect.ValueOf(i)vi.IsNil()
func IsNil(i interface{}) bool {
defer func() {
recover()
}()
vi := reflect.ValueOf(i)
return vi.IsNil()
}
但有这样强加一个defer的recover确实不好看,于是借助类型判断变成这样
func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}