Golang中二进制切片表达式与容量的探讨

Golang中二进制切片表达式与容量的探讨 对于一个切片 ss[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,则默认为原切片的容量。

规范中明确指出:

对于数组或字符串,索引 lowhigh 的范围是 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 值,因此两者完全等价。

回到顶部