Golang中二进制切片表达式与容量的探讨
Golang中二进制切片表达式与容量的探讨
对于一个切片 s,s[a:b] 是否保证等同于 s[a:b:cap(s)]?
这似乎是合理的,但我无法在 Go 编程语言规范 中找到关于此点的明确解释。或者是我误解了规范?
编辑:虽然不是规范,但 Go 切片:用法与内部原理 暗示了这一点。
1 回复
更多关于Golang中二进制切片表达式与容量的探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在 Go 语言规范中,s[a:b] 确实等同于 s[a:b:cap(s)]。根据规范,完整切片表达式 s[low:high:max] 中,如果省略 max,则默认为原切片的容量。
规范中明确指出:
对于数组或字符串,索引
low和high的范围是0 <= low <= high <= len(a)。 对于切片,索引上限是切片的容量cap(a)而不是长度。
示例代码验证:
package main
import "fmt"
func main() {
// 创建切片
s := make([]int, 5, 10)
for i := range s {
s[i] = i
}
// 两种表达式结果比较
s1 := s[2:4]
s2 := s[2:4:cap(s)]
fmt.Printf("s[2:4] 长度:%d 容量:%d\n", len(s1), cap(s1))
fmt.Printf("s[2:4:cap(s)] 长度:%d 容量:%d\n", len(s2), cap(s2))
// 验证底层数组相同
s1[0] = 99
fmt.Printf("修改后 s2[0]=%d\n", s2[0]) // 输出 99
}
输出结果:
s[2:4] 长度:2 容量:8
s[2:4:cap(s)] 长度:2 容量:8
修改后 s2[0]=99
规范中的相关定义:
- 简单切片表达式
s[low:high]的容量是cap(s) - low - 完整切片表达式
s[low:high:max]的容量是max - low
当省略 max 时,实际上就是使用 cap(s) 作为 max 值,因此两者完全等价。

