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

 

posted @ 2020-07-22 10:46  海拉尔  阅读(1175)  评论(0编辑  收藏  举报