我试图理解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
。
1条答案
按热度按时间qco9c6ql1#
切片的容量是从切片的开头开始可以存储在底层数组中的元素数量。底层数组可以存储6个元素。在
example1
中,您从第一个元素开始创建一个新切片,并扩展为4个元素,但容量仍然是6,因为您的切片从底层数组的开头开始。在example2
中,切片从底层数组的第2个元素开始,所以只有4个元素的空间,所以容量是4。This article很好地解释了切片是如何工作的。