切片
概念说明
切片(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。
追加与修改元素示例
| |
输出结果:
| |
make 与切片表达式示例
| |
输出结果:
| |
make 解析
在 b := make([]int, 2, 4) 里,make 会创建并初始化一个可直接使用的切片。
[]int是切片类型。2是长度len,表示当前能直接通过索引访问的元素个数。4是容量cap,表示底层数组当前最多可容纳的元素个数。
这种写法适合你预估元素数量的场景,通常能减少 append 触发扩容的次数。
除了切片,make 也常用于创建 map 和 channel。你先记住一点:make 的作用是把这些依赖运行时结构的类型初始化成可直接使用的值。
字符串转 []rune 统计字符数
有些题目会要求“统计字符串中的字符个数,一个中文算一个”。
这时不能直接写 len(str),因为 Go 字符串底层存的是字节序列,len(str) 统计的是字节数。
在 UTF-8 编码里,常见汉字通常占 3 个字节,英文字母通常占 1 个字节,所以更适合先把字符串转成 []rune 再统计长度。
题目示例:
| |
| |
输出结果:
| |
rune 是什么
rune是int32的别名,用来表示一个 Unicode 码点;初学阶段可以先把它理解成一个字符。[]rune(str)会把字符串按“字符”拆开,所以适合处理中文等多字节字符。byte是uint8的别名,更适合表示原始字节数据;rune能表示的字符范围更大。len([]rune(str))统计的是字符个数,而len(str)统计的是字节个数。
切片排序示例
| |
输出结果:
| |
常见错误
- 对空切片直接按索引赋值(如
list[0] = "x")会触发index out of range。 - 调用
append后不接收返回值,可能导致新增元素没有保存到目标切片。 - 切片边界写错(如
a[3:2]或超过长度)会在运行时 panic。 - 排序示例忘记导入
sort包会导致编译失败。 - 直接用
len(str)统计中文字符串长度,得到的是字节数,不是字符数;这类题通常要先转成[]rune。