Go语言 goalng 切片 slice 空切片 nil切片
一、基础概念
- 长度(len):切片当前包含的元素数量。
- 容量(cap):底层数组能容纳的最大元素数量。
- nil切片:
len=0, cap=0且slice == nil。 - 非nil切片:即使
len=0,只要slice != nil。
二、初始化方法分类
1. nil切片
var a []int // nil切片
- 特性:
len=0, cap=0,且a == nil为true。
2. 空切片
b := []int{} // 空切片
- 特性:
len=0, cap=0,但b != nil。
3. 字面量初始化
c := []int{1, 2, 3} // 3元素切片
- 特性:
len=3, cap=3,自动分配底层数组。
4. 切片操作
(1) 截取子切片
d := c[:2] // 截取前2个元素
- 特性:
len=2, cap=3(继承原切片容量)。
(2) 显式指定容量
e := c[0:2:cap(c)] // 显式指定容量
e1 := c[0:2:2] // 容量不足时取最小值
e:len=2, cap=3(合法)。e1:len=2, cap=2(容量不能超过原底层数组的可用空间)。
(3) 截取0元素
f := c[:0] // 截取0个元素
- 特性:
len=0, cap=3(保留原容量)。
5. make函数
(1) 不指定容量
g := make([]int, 3) // make创建3元素
- 特性:
len=3, cap=3(长度与容量相同)。
(2) 指定容量
h := make([]int, 2, 3) // 指定长度和容量
- 特性:
len=2, cap=3(可独立设置len和cap)。
(3) 容量空切片
i := make([]int, 0, 3) // 容量3的空切片
- 特性:
len=0, cap=3(预分配容量但无元素)。
三、关键区别对比表
| 变量 | 初始化方式 | len | cap | 类型 | 说明 |
|---|---|---|---|---|---|
a |
var []int |
0 | 0 | nil切片 | a == nil 为 true |
b |
[]int{} |
0 | 0 | 非nil切片 | 空切片但 b != nil |
c |
[]int{1,2,3} |
3 | 3 | 非nil切片 | 自动分配底层数组 |
d |
c[:2] |
2 | 3 | 非nil切片 | 截取子切片,保留原容量 |
e |
c[0:2:cap(c)] |
2 | 3 | 非nil切片 | 显式指定容量,合法 |
e1 |
c[0:2:2] |
2 | 2 | 非nil切片 | 容量不能超过原底层数组的可用空间 |
f |
c[:0] |
0 | 3 | 非nil切片 | 截取0元素但保留原容量 |
g |
make([]int,3) |
3 | 3 | 非nil切片 | len 和 cap 相同 |
h |
make(2,3) |
2 | 3 | 非nil切片 | 独立设置 len 和 cap |
i |
make(0,3) |
0 | 3 | 非nil切片 | 预分配容量但无元素 |
四、注意事项
-
nil切片与空切片:
a == nil→true,b == nil→false。make([]int,0,0)等价于[]int{}(空切片)。
-
容量限制:
- 使用
slice[start:end:cap]时,指定的容量不能超过原底层数组的可用空间。
- 使用
-
性能优化:
- 预分配容量(如
make([]int, 0, 3))可避免频繁扩容。 - 追加元素时,若容量不足会触发扩容(默认翻倍)。
- 预分配容量(如
浙公网安备 33010602011771号