切片的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)的 lowhighmax 的含义,以及它们如何影响切片的长度(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

lowhighmax 的含义

  1. low

    • 表示切片的起始位置(包含该索引的元素)。
    • 在两个例子中,low = 5,所以切片都从元素 5 开始。
  2. high

    • 表示切片的结束位置(不包含该索引的元素)。
    • 在两个例子中,high = 8,所以切片包含到索引 7 的元素(即 7),不包含索引 8 的元素 8
  3. 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。

总结

  • s1s[5:8]low = 5high = 8max = 10(默认),结果是 [5 6 7]len = 3cap = 5
  • s2s[5:8:8]low = 5high = 8max = 8,结果是 [5 6 7]len = 3cap = 3
  • lowhighmax 的作用
    • low 决定起点。
    • high 决定当前元素范围(长度)。
    • max 决定潜在空间(容量)。

希望这个解释清楚地回答了你的问题!如果还有疑问,随时问我。

posted @   仁义礼智信的  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示