切片的low high max
如何理解下面代码的low,high,max
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// low:5, high:8, max:10
s1 := s[5:8]
// low:5, high:8, max:8
s2 := s[5:8:8]
// len = high - low
// cap = max - low
fmt.Printf("s1: %v,len: %v,cap: %v\n", s1, len(s1), cap(s1))
fmt.Printf("s2: %v,len: %v,cap: %v\n", s2, len(s2), cap(s2))
让我帮你解析这段 Go 语言代码中关于切片(slice)的 low、high 和 max 的含义,以及它们如何影响切片的长度(len)和容量(cap)。
代码背景
在 Go 中,切片是从底层数组中截取的一部分。切片的定义方式是 s[low:high] 或 s[low:high:max]:
low:切片的起始索引(包含)。high:切片的结束索引(不包含)。max:切片的最大容量边界(不包含),决定了切片可以扩展到的最大范围。
切片的两个重要属性:
- 长度(
len):当前切片包含的元素个数,计算公式为high - low。 - 容量(
cap):切片从low开始到max(或底层数组末尾)的元素个数,计算公式为max - low。
如果没有显式指定 max,则 max 默认等于底层数组的长度。
分析代码
原始数组:s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},长度为 10。
1. s1 := s[5:8]
- 语法:
s[low:high],没有指定max。 - 参数:
low = 5:从索引 5(元素 5)开始。high = 8:到索引 8(元素 8)结束,不包含索引 8。max:未指定,默认等于底层数组的长度,即 10。
- 结果:
- 切片
s1的元素:[5, 6, 7](从索引 5 到 7)。 - 长度(
len)=high - low=8 - 5= 3。 - 容量(
cap)=max - low=10 - 5= 5。
- 切片
- 输出:
s1: [5 6 7], len: 3, cap: 5。
2. s2 := s[5:8:8]
- 语法:
s[low:high:max],显式指定了max。 - 参数:
low = 5:从索引 5(元素 5)开始。high = 8:到索引 8(元素 8)结束,不包含索引 8。max = 8:容量边界为索引 8。
- 结果:
- 切片
s2的元素:[5, 6, 7](从索引 5 到 7)。 - 长度(
len)=high - low=8 - 5= 3。 - 容量(
cap)=max - low=8 - 5= 3。
- 切片
- 输出:
s2: [5 6 7], len: 3, cap: 3。
low、high 和 max 的含义
-
low:- 表示切片的起始位置(包含该索引的元素)。
- 在两个例子中,
low = 5,所以切片都从元素5开始。
-
high:- 表示切片的结束位置(不包含该索引的元素)。
- 在两个例子中,
high = 8,所以切片包含到索引 7 的元素(即7),不包含索引 8 的元素8。
-
max:- 表示切片容量(
cap)的上限,决定了切片可以扩展到的最大范围。 - 在
s1中,max未指定,默认是数组长度 10,所以容量是10 - 5 = 5。 - 在
s2中,max = 8,显式限制了容量,所以容量是8 - 5 = 3。
- 表示切片容量(
长度和容量的区别
- 长度(
len):由high - low决定,表示当前切片中实际包含的元素个数。 - 容量(
cap):由max - low决定,表示切片从low开始到max的潜在空间大小。如果后续通过append操作扩展切片,容量限制了它最多能扩展到哪里。
示例解释
s1的容量是 5,意味着它还可以扩展到原始数组的末尾(索引 9),可以追加元素[8, 9]。s2的容量是 3,意味着它只能容纳当前 3 个元素[5, 6, 7],无法再扩展,因为max被限制为 8。
总结
s1:s[5:8],low = 5,high = 8,max = 10(默认),结果是[5 6 7],len = 3,cap = 5。s2:s[5:8:8],low = 5,high = 8,max = 8,结果是[5 6 7],len = 3,cap = 3。low、high和max的作用:low决定起点。high决定当前元素范围(长度)。max决定潜在空间(容量)。
希望这个解释清楚地回答了你的问题!如果还有疑问,随时问我。

浙公网安备 33010602011771号