为什么在 Go 代码中,向切片中添加元素后,切片的容量(cap)会变成 6 而不是 5?
切片容量计算:cap 返回 6 原因
在下面这段 go 代码中,有一个切片 s,代码中使用了 append 函数向 s 添加了元素。问题是,在将 [2, 3, 4] 添加到 s 后,cap(s) 返回 6,而不是 5。
package main import "fmt" func main() { var s []int printSlice(s) // len=0 cap=0 [] // 添加一个空切片 s = append(s, 0) printSlice(s) // len=1 cap=1 [0] // 这个切片会按需增长 s = append(s, 1) printSlice(s) // len=2 cap=2 [0 1] // 可以一次性添加多个元素 s = append(s, 2, 3, 4) printSlice(s) // len=5 cap=6 [0 1 2 3 4] cap为什么是6? } func printSlice(s []int) { fmt.Printf("len=%d cap=%d %v ", len(s), cap(s), s) }
回答:
虽然切片的 len 始终等于存储在该切片中的元素数量,但 cap 可以根据不同的因素而有所不同。在 go 中,cap(s) 始终满足以下条件:
- cap(s) >= len(s)
在你的示例中,s 是一个空切片,所以它的初始容量(cap)为 0。当添加第一个元素时,容量增加到 1。当添加 [2, 3, 4] 时,由于容量必须大于或等于长度,因此容量增加到 6。这是为了优化,避免频繁分配和复制切片内存。
以上就是为什么在 Go 代码中,向切片中添加元素后,切片的容量(cap)会变成 6 而不是 5?的详细内容,更多请关注其它相关文章!