结论:
1、nil不是golang的关键字,可以进行赋值操作。但是不建议
2、nil标识符是没有类型的,所以==对于nil来说是一种未定义的操作,不可以进行比较,而这个在python中是可以比较的,在 python 中,两个None 值永远相等
3、同类型的nil比较中,指针类型nil、channel类型的nil、interface类型可以相互比较,而func类型、map类型、slice类型只能与nil标识符比较,两个类型相互比较是不合法的。
fmt.Println((*int64)(nil)==(*int64)(nil))
fmt.Println((chan int)(nil)==(chan int)(nil))
fmt.Println((func())(nil)==nil)
fmt.Println((interface{})(nil)==(interface{})(nil))
4、不同类型的nil比较:指针类型和channel类型与接口类型可以比较,其他类型的之间是不可以相互比较的。为什么指针类型、channel类型可以和接口类型进行比较呢?(目前不明白,推测能互相比较类型都是引用类型,不能比较的是值类型)
5、interface和nil比较时,只有interface底层的数据结构中,必须要类型和值同时都为 nil 的情况下,interface 的 nil 判断才会为 true
6、一个nil的map可以读数据,不可以写数据,所以使用的时候要用make初始化
7、一个nil的chan,读写都会阻塞,关闭会panic
8、一个为nil的slice,不可以进行索引,否则会引发panic,其他操作是可以。
详细参考:
面试官:两个nil比较结果是什么?
视频学习