- nil是go语言中预先的标识符
- nil仅可以代表指针、通道(channel)、函数(function)、接口(interface)、映射(map)或切片(slice)的默认零值,也就是在定义这些类型的变量,为其分配内存时是利用nil来充当其默认零值来填充为其分配的内存,而其他类型比如数字则是利用默认值0,布尔类型则是用默认值false来填充对应的内存空间
比如下例:
第一个是因为我们想创建一个demo.Movie这个结构体对象,new()为其分配内存时,为其各个属性分配初始零值或者执行默认初始化比如Title 是string类型,则用默认零值""来初始化Title属性,所以虽然new()函数最终返回一个指针类型,但这个指针并不为nil, 因为其已经指向了一块为demo.Moive分配的零值内存空间,并不需要为其分配零值nil了。
而第二个输出,显然我们只声明了一个demo.User类型的指针,但是并没有指定其具体指向内存的哪块存储空间,也就是没有对这个指针变量执行初始化,所以在为其分配空间时,对其进行默认初始化,也就是用指针类型的默认值nil来填充为其分配的内存空间
func main() {
movie := new(demo.Movie)
fmt.Printf("movie:%+v movie==nil?%+v\n",movie,movie==nil) //movie:&{Title: Year:0 Color:false Actors:[]} movie==nil?false
var m2 *demo.Movie
fmt.Printf("m2:%+v m2==nil?%+v\n", m2, m2==nil) //m2:<nil> m2==nil?true
}