关于nil map和nil slice
1 Nil
Golang
的nil
是对于传统C系语言null
所做的一个安全性优化,笔者在学习map
和slice
有一些相关的疑惑。
在如下代码运行后,map0
和slice0
的值均为nil
:
var map0 map[string]int
var slice0 []string
与之对应的是比较安全的建立方式,这种情况下建立的空map
和空slice
都非nil
值:
map1 := make(map[string]int, 0)
slice1 := make([]string, 0)
2 对map == nil
对于map
增加键值对,前者会发生panic
,而后者可以:
map0['maths'] = 60 //panic: assignment to entry in nil map
map1['maths'] = 60 //OK
3 对slice == nil
对于slice
的常规操作,则两者都可以进行:
append(slice0, "maths")
append(slice1, "maths")
range(slice0)
range(slice1)
len(slice0)
len(slice1)
4 原因分析
map
增加键值对的行为是在Golang
底层实现的,而slice
的append
,range
,len
操作都是在builtin
包内的函数实现的,对nil
值情况做了差错控制。
5 结论
用make
,请。