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两个变量反射出的值是一样的,但是它们本身的底层结构在初始化的时候是不一样的。
简单记录,如有错误请指教。