Go 语言中的切片:从声明、初始化到追加与遍历

周叙
周叙
发布时间:2026-08-25| 105人浏览过
原创

前言

在 Go 入门阶段,切片往往比数组更早进入日常编码,但“长度”“容量”“追加”和“截取”这些概念也最容易混淆。本文按创建、赋值、扩展与遍历几个高频动作展开,结合原始示例代码说明每种写法的结果,帮你快速建立对切片基础用法的判断。

在 Go 里,切片几乎是处理列表数据时最常见的选择,但很多初学者一开始容易把它和数组混在一起。本文按“怎么创建、怎么改、怎么扩展、怎么读取”的顺序梳理切片的常见用法,保留每一步的示例代码,读完之后你可以快速判断什么时候该用切片,以及几个基础操作分别会带来什么结果。

切片是什么,和数组有什么区别

切片可以理解为一组可变长度、元素类型相同的数据集合。它和数组最直接的区别在于:数组长度固定,而切片长度不固定,可以在使用过程中继续追加元素。

也正因为长度可变,切片在 Go 日常开发中的使用频率通常比数组更高。尤其是在需要动态收集数据、批量处理结果,或者无法提前确定元素个数的场景里,切片会更合适。

切片怎么声明和初始化

先声明,再使用

切片在使用前需要初始化。未初始化的切片值为 nil,这一点和已经分配好长度的切片不同。

Go 切片追加与再切片操作的暖色专栏配图
切片如何扩展与截取切片真正常用的不是“存”,而是“扩”和“取”,这张图把 append。
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,先把这些基础操作练熟,后面再去理解容量变化、底层共享和更复杂的使用细节,会更容易建立清晰的概念。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。