About Nil Map and Nil Slice


关于nil map和nil slice

1 Nil

Golangnil是对于传统C系语言null所做的一个安全性优化,笔者在学习mapslice有一些相关的疑惑。

在如下代码运行后,map0slice0的值均为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底层实现的,而sliceappend,range,len操作都是在builtin包内的函数实现的,对nil值情况做了差错控制。

5 结论

make,请。


Author: Luminolt
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Luminolt !
  TOC