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,指针为空。

GoLang nil与interface的空指针深入分析

GoLang nil与interface的空指针深入分析

map

一个nil的map,是一个真正的空指针,除len与for-range外,其他操作不能正常使用。

map[string]int{}

interface

interface底层由两部分组成(参见《golang反射简介》),一个是类型,一个值,也就是类似于:(Type, Value)。只有当类型和值都是nil的时候,才等于nil:

本身是interface时,传递interface参数,其nil属性不变;若是普通指针,则传递给interface参数时,都为非空(!=nil);

指针是否为空

那如何判定interface里面的动态值是否空?此时需要借助反射reflect来实现:

对于非指针类型,在反射后调用IsNil时会抛出异常。其实现: