Go Slice

Slice 是 Go 中最常用的顺序数据结构抽象,本质上是对底层数组的一层轻量视图和描述符。

#type / concept #status / growing #tech / dev #resource / go

[!info] related notes

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 都会持续出现。

边界与易混淆点

  • nil slice 和空 slice 不完全一样
  • append 可能复用原数组,也可能触发扩容并换新底层数组
  • lencap 不是一回事
创建于 2026/6/20 更新于 2026/6/20