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
}