为什么cap不打印基础数组的长度?

Han*_*tsy -1 arrays go slice

我正在阅读“ 切片之旅”,在“ 切片长度和容量”部分中,运行了示例:

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    // Slice the slice to give it zero length.
    s = s[:0]
    printSlice(s)

    // Extend its length.
    s = s[:4]
    printSlice(s)

    // Drop its first two values.
    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
Run Code Online (Sandbox Code Playgroud)

当我构建应用程序并运行它时,它显示如下:

len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]
Run Code Online (Sandbox Code Playgroud)

在Go文档中,上限是基础数组的长度,为什么它的值不是6?

icz*_*cza 9

在Go文档中,上限是基础数组的长度,为什么它的值不是6?

因为容量不是后备阵列的大小(在某些情况下相等时可能会出现特殊情况,但通常情况下并不相同)。当通过切片支持数组来创建切片时,使用0低索引(或省略),而数组长度使用高索引(或省略),那么,容量将等于数组的长度。

规格:长度和容量:

切片的容量是在基础数组中为其分配了空间的元素数。

因此,容量从切片的第一个元素开始,如果与后备数组的第一个元素不同,则它们将不相等。您链接的“ 游览”页面中也明确说明了这一点:

切片的容量是从切片中的第一个元素开始计算的基础数组中元素的数量

还有一个完整的切片表达式,其形式为:

a[low : high : max]
Run Code Online (Sandbox Code Playgroud)

在可以控制结果切片的容量的位置,可以限制将来的切片可以扩展切片的范围。该max索引可指向一个元件之前的阵列的最后一个元素。

请参阅以下示例:

a := [10]int{}

s := a[:] // len=10, cap=10
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))

s = a[2:] // len=8, cap=8
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))

s = a[2:7] // len=5, cap=8
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))

s = a[2:7:8] // len=5, cap=6
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上尝试):

len=10, cap=10
len=8, cap=8
len=5, cap=8
len=5, cap=6
Run Code Online (Sandbox Code Playgroud)