go的nil
go中的nil的定义可以在buildtin.go里面找的
由于某些错误信息的循环引用,网上有一定资料指出nil就是一个平平无奇的int零值。
但是如果写出如下的代码。
var e error
if e == 0 {
//
}
var e error
var i int
if e == i {
//
}
var e error
type T int
var i T
if e == i {
//
}
这三段代码都是无法通过编译的。
更进一步来看,事实上如果你要把nil看成int类型的话,Type的定义最起码得在nil上面吧。
事实上,builtin里面的代码只是起到的说明作用,有很多语法特性其实不是自描述的,当然不是说go的编译器不是自举的意思。nil是某一种关键字。可以同时代表指针、interface、map、slice啥的零值,可以自动从nil升格到对应的类型。
当变量被定义后,默认的值就是零值。当然nil是不能升格到struct的。因为值是值。指针、interface都是相对的高级存在。而slice、map也是某一种暗含机制的东西、不能看成普通的类。所以需要nil,因为他们的零值涉及到很多核心的变量,而不是普通的基础类型或者struct,不是普通的0或者0的堆砌或者成员全零值{}所能描述的,内部的变量可能不是全零值的。而基础类型、struct可以用0或者0的堆砌或者{}来描述,就不需要nil描述了。
主要是这些特殊类型的玩意也不好初始化移了默认值,interface就不说了,其它几种都是需要make进行初始化的。
函数也是一个指针,可以赋nil
map slice什么的本质上也是指针
这些都是go里面不能自举的黑魔法,所以有些时候看起来是有点奇怪的。
License:
CC BY 4.0