Nil in Go
发布于 • 作者: Ethan
原本是一段时间前看的Go开发者大会(不记得是哪一年)的演讲,关于各类型nil的作用,现在忘了,复习一下。
不同类型的nil属于不同类型,不能直接比较(编译报错)。
指针的
nil表示不指向任何内存地址。
nil表示底层的数组指针为nil,len和cap都为0。
表示未初始化(未分配内存)。
nil map写入会panic,读取会返回该类型零值。表示未初始化(未分配内存)。
close会panic。select过滤无效分支:如果select的chan是nil,则永远无法被选中。表示未绑定任何函数
接口由两个部分组成:
// $GOROOT/src/runtime/runtime2.gotype
iface struct {
tab *itab // 类型信息指针
data unsafe.Pointer // 实际数据指针
}
一个接口为nil当且仅当:
tab == nil && data == nil
e.g.
var p *int = nil
var i interface{} = p // i 的类型是 *int,值是 nil
fmt.Println(i == nil) // 输出:false(因为类型部分非 nil)
error接口,为nil时表示成功。