Tip #13 使用空切片还是更好的NIL切片

原始链接:Golang Tip #13: Empty slice or, even better, NIL SLICE.

在Go里面使用切片的时候,有两个可以让你得到看起来像空切片的方法:

- 使用var关键字:var t []int

这个方法声明了一个int类型的切片t,但并没有对它进行初始化。这时候这个切片被认为是nil的。

这意味着它并没有指向任何的底层数组。它的长度(len)和容量(cap)都是0。

- 使用切片字面量: t := []int{}

跟使用var声明的切片不一样,这个切片不是nil的。这个切片的指向了一个底层的数组,但这个数组并没有包含任何的元素。

所以,哪种方式更惯用呢?

1. nil切片没有分配任何的内存。

nil切片只是一个没有指向任何地方的指针,而空切片([]int{})则分配了很小的内存去指向一个空数组。

大多数情况下,这种差异是可以忽略的,但是对于有性能要求的应用来说,这个差异影响就比较明显了。

2. Go社区更倾向于使用nil切片的方式,因为这更加符合Go语言简单的哲学以及切片本身的零值。

3. 当然,也有例外的情况。

例如,在使用JSON的时候,nil切片和空切片的表现是不一样的。

nil切片(var t []int)编码成JSON后的值是null,而空切片(t := []int{})编码成JSON后的值是一个空的JSON数组([])。

4. 在设计代码的时候,你应该同等对待非空切片、空切片和nil切片

如果你比较熟悉Go,你可能已经知道,对nil切片进行for rangelenappend等操作是不会引起panic的。