切片
概念说明
切片(Slice)是对底层数组的一个连续片段视图。
和数组相比,切片长度可变,更适合日常开发中的动态数据场景。
在 Go 中,切片是最常用的序列类型。
语法/规则
- 切片类型写法是
[]T,例如 []int、[]string。 - 零值切片是
nil,len 和 cap 都是 0。 make([]T, len, cap) 用于创建切片,cap 可省略(默认等于 len)。append 可能返回新的底层数组,因此通常要写成 s = append(s, x)。- 切片表达式
a[low:high] 左闭右开,包含 low,不包含 high。
追加与修改元素示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| package main
import "fmt"
func main() {
list := []string{}
list = append(list, "阿斌")
list = append(list, "知道")
fmt.Println(list)
fmt.Println(len(list))
list[1] = "不知道"
fmt.Println(list)
}
|
输出结果:
make 与切片表达式示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| package main
import "fmt"
func main() {
var a []int
b := make([]int, 2, 4)
b[0], b[1] = 10, 20
base := [5]int{10, 20, 30, 40, 50}
part := base[1:4]
fmt.Println(a == nil, len(a), cap(a))
fmt.Println(b == nil, len(b), cap(b), b)
fmt.Println(part, len(part), cap(part))
}
|
输出结果:
1
2
3
| true 0 0
false 2 4 [10 20]
[20 30 40] 3 4
|
make 解析
在 b := make([]int, 2, 4) 里,make 会创建并初始化一个可直接使用的切片。
[]int 是切片类型。2 是长度 len,表示当前能直接通过索引访问的元素个数。4 是容量 cap,表示底层数组当前最多可容纳的元素个数。
这种写法适合你预估元素数量的场景,通常能减少 append 触发扩容的次数。
如果你想进一步了解 make 在 map、channel 上的写法,可以查看 make 详解
。
切片排序示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| package main
import (
"fmt"
"sort"
)
func main() {
nums := []int{4, 5, 3, 2, 7}
sort.Ints(nums)
fmt.Println("升序:", nums)
sort.Sort(sort.Reverse(sort.IntSlice(nums)))
fmt.Println("降序:", nums)
}
|
输出结果:
1
2
| 升序: [2 3 4 5 7]
降序: [7 5 4 3 2]
|
常见错误
- 对空切片直接按索引赋值(如
list[0] = "x")会触发 index out of range。 - 调用
append 后不接收返回值,可能导致新增元素没有保存到目标切片。 - 切片边界写错(如
a[3:2] 或超过长度)会在运行时 panic。 - 排序示例忘记导入
sort 包会导致编译失败。