Go nil切片和空切片的区别
在Go语言中,nil 切片和空切片是两种不同的空状态,它们之间具有一些重要的区别。
nil 切片
当我们声明一个切片类型的变量但并不进行初始化时,在没有任何赋值的情况下,它的默认值就是 nil。在逻辑上,你可以将 nil 切片视为一个不存在的切片。
var s []int // s 现在是 nil
对 nil 切片进行 len() 和 cap() 操作,结果都将返回 0。你也可以将 nil 切片添加到任何切片的末尾,这等同于什么都没做。但是,与空切片相比,nil 切片在做 append() 操作时有一个重要的区别,那就是当 nil 切片通过 append() 函数追加元素后,它就会产生一个长度和容量都为1的新切片。
空切片
空切片是已经分配了内存空间但是并没有包含任何元素的切片。我们可以通过 make() 函数或者字面量方式像这样创建一个空切片:
s1 := []int{} // s1 是一个空切片,通过字面量创建
s2 := make([]int, 0) // s2 也是一个空切片,通过 make 创建
空切片的 len() 和 cap() 都返回 0,这同 nil 切片相同。你也可以像 nil 切片一样处理空切片。但是一个被分配了内存的空切片与 nil 切片在底层实现上是有区别的。特别的是,对于一个空切片,即使紧接着进行 append() 操作,其地址也不会发生改变,因为切片在创建时就已经预分配了一定的内存空间。
总的来说,可以在需要表示“不存在”和“空集合”两种不同的状态时来区分 nil 切片和空切片。