Golang在不同的切片方式下表现出不同的能力

aiazj4mn  于 2023-04-27  发布在  Go
关注(0)|答案(1)|浏览(112)

我试图理解Go中的切片,并遇到了以下代码(Go playground):

package main

import "fmt"

func main() {
    s := []int{1, 2, 3, 4, 5, 6}
    example1(s)
    fmt.Printf("\n")
    example2(s)
}

func example1(s []int) {
    fmt.Printf("Example 1: \n")
    printSlice(s)

    s = s[:4]
    printSlice(s)
}

func example2(s []int) {
    fmt.Printf("Example 2: \n")
    printSlice(s)

    s = s[2:]
    printSlice(s)
}

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

其输出为:

Example 1: 
len=6 cap=6 [1 2 3 4 5 6]
len=4 cap=6 [1 2 3 4]

Example 2: 
len=6 cap=6 [1 2 3 4 5 6]
len=4 cap=4 [3 4 5 6]

虽然切片的长度看起来不错,但我不明白的是为什么切片后的容量在第一个示例中是6,而在第二个示例中是4

qco9c6ql

qco9c6ql1#

切片的容量是从切片的开头开始可以存储在底层数组中的元素数量。底层数组可以存储6个元素。在example1中,您从第一个元素开始创建一个新切片,并扩展为4个元素,但容量仍然是6,因为您的切片从底层数组的开头开始。在example2中,切片从底层数组的第2个元素开始,所以只有4个元素的空间,所以容量是4。
This article很好地解释了切片是如何工作的。

相关问题