在 Go 里,切片几乎是处理列表数据时最常见的选择,但很多初学者一开始容易把它和数组混在一起。本文按“怎么创建、怎么改、怎么扩展、怎么读取”的顺序梳理切片的常见用法,保留每一步的示例代码,读完之后你可以快速判断什么时候该用切片,以及几个基础操作分别会带来什么结果。
切片是什么,和数组有什么区别
切片可以理解为一组可变长度、元素类型相同的数据集合。它和数组最直接的区别在于:数组长度固定,而切片长度不固定,可以在使用过程中继续追加元素。
也正因为长度可变,切片在 Go 日常开发中的使用频率通常比数组更高。尤其是在需要动态收集数据、批量处理结果,或者无法提前确定元素个数的场景里,切片会更合适。
切片怎么声明和初始化
先声明,再使用
切片在使用前需要初始化。未初始化的切片值为 nil,这一点和已经分配好长度的切片不同。


var slice []int
fmt.Println(slice == nil) // nil
这段代码说明,单纯声明一个切片变量时,它还没有实际数据内容。
用 make() 创建切片
如果你已经知道切片需要的长度,或者希望顺带指定容量,可以用 make() 初始化。
// 初始化一个长度为3,容量为5的切片
// 第三个参数容量,可以不指定
var slice = make([]int, 3, 5)
// 打印切片、长度、容量
fmt.Println(slice, len(slice), cap(slice))
这里的长度是当前可直接访问的元素个数,容量则表示底层可容纳的上限。第三个参数可以省略,只保留长度。
直接字面量赋值
如果初始化时就已经有明确的数据内容,直接赋值会更直观。
var slice = []int{1, 2, 3} // 直接赋值
这种方式常用于示例代码、测试数据,或者一开始就有固定初始值的场景。
从已有数据中截取
切片还可以通过对数组或已有序列进行截取获得。原文示例里使用的是一组整数进行切片操作:
var a = []int{4, 5, 6, 7, 8}
//对数组a进行切片,从第2个元素到第4个元素,不含第4个元素
var slice = a[1:3] // [5, 6]
这里要注意区间规则:[1:3] 表示从索引 1 开始,到索引 3 结束,但不包含索引 3 对应的元素,所以结果是 [5, 6]。
切片怎么赋值和追加元素
按索引修改元素
切片和数组一样,都可以通过索引访问和修改元素,索引从 0 开始。
var slice = make([]int, 3, 5)
// 对第2个元素赋值,切片的索引和数组一样,从0开始
slice[1] = 100
fmt.Println(slice[1]) // 100
这种方式适合已经分配好长度、需要按位置写入数据的情况。
用 append() 动态扩展
切片最实用的能力之一,就是可以通过 append() 继续追加元素。当现有容量不够时,切片的容量还可能随之增大。
var slice []int
// 向切片追加一个元素200
slice = append(slice, 200)
// 批量追加
slice = append(slice, 300, 400, 500)
// 向切片追加另一个切片
slice1 := []int{600, 700, 800}
// ...就是将切片的元素转换成多个参数传入
slice = append(slice, slice1...)
fmt.Println(slice) // [200 300 400 500 600 700 800]
上面这段代码包含了三种常见写法:
- 追加单个元素;
- 一次追加多个元素;
- 把另一个切片展开后批量追加,其中
...表示把切片元素逐个传入。
如果你需要不断向集合中补充数据,切片通常会比数组更自然。
再切片与遍历的常见写法
对切片继续切片
切片本身还可以继续截取,这一点和前面介绍的切片操作规则一致。
var slice = []int{1, 2, 3, 4, 5}
// 从第2个元素截取到第4个元素,不含第4个元素
fmt.Println(slice[1:3]) // [2 3]
同样地,结果不包含结束位置对应的元素,所以输出为 [2 3]。这类写法在提取子区间、截取分页数据或处理中间片段时很常见。
遍历切片的两种方式
遍历切片时,最常见的是普通 for 循环和 for range 两种方式。
var slice = []int{1, 2, 3, 4, 5}
// for 循环遍历
for i := 0; i < len(slice); i++ {
fmt.Println(slice[i])
}
// range 返回两个参数:索引和元素值
for i, v := range slice {
fmt.Println(i, v)
}
两种方式的区别主要在使用感受上:
for循环更适合你需要精确控制索引的场景;for range更简洁,适合同时获取索引和值。
理解切片时,重点记住这几件事
把这篇内容串起来看,Go 切片的基础可以归纳为几条核心认识:
- 切片是同类型元素的集合,但长度可变;
- 未初始化的切片值为
nil; - 可以通过
make()、字面量赋值、截取已有数据三种常见方式创建; - 可以按索引赋值,也可以用
append()持续追加; - 支持再次切片和多种遍历方式。
如果你刚开始学 Go,先把这些基础操作练熟,后面再去理解容量变化、底层共享和更复杂的使用细节,会更容易建立清晰的概念。









