nil
==
nil并不是Go语言的关键字或者保留字,而是一个预定义好的标识符:
nil==niloperator == not defined on untyped nilmap、slice、pointer、channel、func、interface
在64位机器上运行时nil的大小:
slice
一个nil的slice,除了不能索引外,其他的操作都正常;当append元素时,slice会自动进行扩容。
slice是一个简单的结构体,包含(长度、容量、指向数组的指针);当slice为nil时,长度、容量都为0,指针为空。
map
一个nil的map,是一个真正的空指针,除len与for-range外,其他操作不能正常使用。
map[string]int{}
interface
interface底层由两部分组成(参见《golang反射简介》),一个是类型,一个值,也就是类似于:(Type, Value)。只有当类型和值都是nil的时候,才等于nil:
本身是interface时,传递interface参数,其nil属性不变;若是普通指针,则传递给interface参数时,都为非空(!=nil);
指针是否为空
那如何判定interface里面的动态值是否空?此时需要借助反射reflect来实现:
对于非指针类型,在反射后调用IsNil时会抛出异常。其实现: