golang interface nil 小记


复习golang interface nil 判断的时候写了代码试了试,初学者(像我)容易懵,现在可能也没搞清楚,记下来看看。

func main() {
	var b interface{}
	fmt.Println(reflect.TypeOf(b), "/", reflect.ValueOf(b))
	fmt.Println(b == nil)
	b = (*interface{})(nil)
	fmt.Println(reflect.TypeOf(b), "/", reflect.ValueOf(b))
	fmt.Println(b == nil)

	fmt.Println("------")

	var c *interface{} //仅仅这一行有区别
	fmt.Println(reflect.TypeOf(c), "/", reflect.ValueOf(c))
	fmt.Println(c == nil)
	c = (*interface{})(nil)
	fmt.Println(reflect.TypeOf(c), "/", reflect.ValueOf(c))
	fmt.Println(c == nil)
}

输出结果:

 / 
true
*interface {} / 
false
------
*interface {} / 
true
*interface {} / 
true

按道理说一个变量反射出的的type和value一样,等于nil的判断结果也应该相同,但是输出看出并不同。过一会儿想起来,interface和一般的变量结构本身就是不同的,b是一个接口,而c是接口的指针。
接口是否等于nil需要type和value都等于nil,而指针的value等于nil则可以直接等于nil。所以虽然b和c两个变量反射出的值是一样的,但是它们本身的底层结构在初始化的时候是不一样的。

简单记录,如有错误请指教。