go中interface{}判nil
在go中的nil只能赋值给指针、channel、func、interface、map或slice类型的变量
interface 在底层,interface作为两个成员来实现,一个类型和一个值假设为type 和value
type存储类型 ,value存储类型的值
只有内部类型都为nil,总的interface才是空的。
var inter interface{} = nil
if inter==nil{
fmt.Println("empty")
}else{
fmt.Println("not empty")
}
结果为 empty
nil为untyped类型,赋值给interface,则type和value都是nil,比较的结果是true
其他有类型的赋值给inter,结果是false,例如
var inter interface{} = (*int)(nil)
if inter==nil{
fmt.Println("empty")
}else{
fmt.Println("not empty")
}
结果为 not empty
对interface{}判空的方法是使用反射的方式进行判断
var inter interface{} = (*int)(nil)
if IsNil(inter){
fmt.Println("empty")
}else{
fmt.Println("not empty")
}
func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}
结果为 empty