Go Slice
Slice 是 Go 中最常用的顺序数据结构抽象,本质上是对底层数组的一层轻量视图和描述符。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
- 所属 MOC: Go 语言基础 MOC, Go 类型系统与抽象 MOC
- 前置概念: Go 基本类型
- 易混淆概念: Go 中的值、指针与引用语义, Go Map
Go Slice
一句话定义
Slice 是 Go 中对顺序数据最常用的抽象,它不是数组本身,而是“指向底层数组某一段的描述符”。
核心机制 / 工作原理
理解 slice,最重要的是先分清:
- 数组:长度固定,值类型
- slice:指向数组区间的运行时结构,通常包含指针、长度、容量
因此 slice 有几个典型特征:
- 可以动态增长
- 多个 slice 可能共享同一底层数组
- 传递 slice 时会复制描述符,但底层数据可能仍然共享
最小例子 / 最小场景
nums := []int{1, 2, 3, 4}
part := nums[1:3]
part[0] = 99
fmt.Println(nums) // [1 99 3 4]
这个例子最关键的点是:
- 改
part,可能影响nums - 因为它们共享底层数组
为什么 slice 这么重要
Go 里大量标准库 API、并发处理、I/O 和数据处理都围绕 slice 展开。对 slice 心智不清,后面性能和 bug 都会持续出现。
边界与易混淆点
nilslice 和空 slice 不完全一样append可能复用原数组,也可能触发扩容并换新底层数组len和cap不是一回事