如何理解下面代码的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
决定潜在空间(容量)。
希望这个解释清楚地回答了你的问题!如果还有疑问,随时问我。