当我们需要创建空切片时,一般有以下3种方式
var s []int //1
s := []int{} //2
s := make([]int, 0) //3
这三种方式创建的切片的长度和容量都为0,但切片的类型不全是空切片,而是分为nil切片和空切片,切片的指向数组也分为有和没有。
var s1 []int
指向数组:不指向任何底层数组
切片长度:0
切片容量:0
切片类型:nil切片
s1 := []int{}
指向数组:指向一个长度和容量都为 0 的底层数组。
切片长度:0
切片cap:0
切片类型:空切片
s1 := make([]int, 0)
指向数组:指向一个长度和容量都为 0 的底层数组。
切片长度:0
切片容量:0
切片类型:空切片
为什么会出现这样的情况,首先要知道空切片和nil切片是啥。
空切片和nil切片
空切片 和 nil切片,他们看似相同,但又有许多不同的地方。
众所周知,go在声明一个变量时,如果没有对这个变量进行赋值,那么这个变量的值将会默认被设置为该变量类型的零值。
切片的零值就是nil, 我们用var声明一个切片,而不赋值,那么得到的切片的值就为nil,而不是空,这个切片也叫做nil切片。
我们用短声明 (:=) 或make函数去初始化一个切片, 这两种方式都对切片进行了初始化处理(声明并赋值), 而不止是声明,所以得到的切片的值不为nil, 而是空(例如int[] {})
空切片是有指向长度为0的底层数组的,而nil切片是没有指向底层数组的。
1. 指向数组:
- nil 切片: 不指向任何底层数组。
- 空切片: 指向一个长度和容量都为 0 的底层数组。
2. 长度:
- nil 切片: 长度为 0。
- 空切片: 长度为 0。
3. 容量:
- nil 切片: 容量为 0。
- 空切片: 容量为 0。
4. 值:
- nil 切片: 值为 nil。
- 空切片: 值为 空。
5. 创建方式:
- nil 切片: 可以通过 var声明 来创建。
- 空切片: 可以通过使用 短声明 (:=) 或 make函数 来创建。
6. 使用:
- nil 切片: 无法直接使用,需要先进行初始化。
- 空切片: 可以直接使用,例如可以使用
append
函数向其追加元素。
需要注意的是,如果我们需要一个长度为0的切片,为节省内存,可以创建一个nil切片,而不是空切片。如果我们创建了一个nil切片, 因为未对其赋值,其无法直接使用,需要先进行初始化之后才可正常使用。