跳到主要内容

Go 切片操作

· 阅读需 3 分钟
素明诚
Full stack development

切片的基本概念

切片是 Go 语言中一个动态数组的引用类型,提供了一种灵活、高效的方式来处理数据集合。它不存储任何数据,只是对底层数组的一个连续片段的描述,包括三个部分 指向数组的指针、切片的长度和容量。

切片创建和索引

两个参数的切片(arr[start:end])

当使用两个参数对数组或已存在的切片进行切片操作时

  • 长度(len)end - start 计算得出,表示切片覆盖的元素数量。
  • 容量(cap) 从切片的起始索引到原数组或原切片末尾的元素数量。计算方式是原数组或切片的长度减去切片的起始索引。
arr := [5]int{1, 2, 3, 4, 5}
s := arr[1:3]
// s 包含元素 [2, 3]
// len(s) == 2
// cap(s) == 4 (从索引1到数组末尾)

三个参数的切片(arr[start:end:cap])

使用三个参数进行切片操作可以更精确地控制切片的容量

  • 第三个参数(容量上限) 定义了切片从起始索引开始能扩展到的数组或切片的最远边界的索引。
  • 切片的实际容量由 cap - start 计算得出,但不能超过从起始索引到原数组或原切片末尾的长度。
arr := [5]int{1, 2, 3, 4, 5}
t := arr[1:3:4]
// t 包含元素 [2, 3]
// len(t) == 2
// cap(t) == 3 (从索引1开始,可以扩展到索引4之前)

切片的行为

  • 不修改原始数组 通过切片操作不会修改底层数组的内容,切片仅作为对数组某部分的引用。
  • 切片的修改影响数组 如果通过切片修改了元素,同样的修改会反映在底层数组上。
  • 切片扩展 切片可以通过 append() 函数进行扩展,但是如果扩展后的长度超过了切片的容量,Go 语言运行时会分配一个新的数组来存储数据,原有数组的内容会被复制到新数组中。

使用场景和注意事项

  • 使用两个参数的切片适用于简单的数据访问和部分修改,而三个参数的切片适用于需要严格控制切片容量和安全性的场景,如并发编程中防止切片操作影响到原数组的其他部分。
  • 切片的容量控制尤其重要,因为它影响着切片的扩展能力和性能表现。