go len 与 cap 的区别
为了搞懂这个问题,先看一段代码:
package main import "fmt" func main() { s := []int{2, 3, 5, 7, 11, 13} printSlice(s) s = s[:0] printSlice(s) s = s[:4] printSlice(s) s = s[2:] printSlice(s) } func printSlice(s []int) { fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) }
结果:
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]
解析:
len 长度是当前元素个数 cap 长度是底层元素个数
s := []int{2, 3, 5, 7, 11, 13} printSlice(s) len: 6 cap:6 正确
s = s[:0] len: 0 cap: 6 目前就只有0个元素,底层数组还是6个 printSlice(s)
s = s[:4] printSlice(s) len: 4 cap:6 目前是4个元素,底层还是6个
s = s[2:] printSlice(s) len: 2 cap: 4 目前是2个元素,底层元素是从第一个元素往后数的,目前是4
从上可以看出:
- len 计算的是当前数组元素的个数,
- cap计算的是当前切片开始位到数组最后一个元素的个数