append对len和cap的影响

【append对len和cap的影响】怀抱观古今,寝食展戏谑。这篇文章主要讲述append对len和cap的影响相关的知识,希望能为你提供帮助。

package mainimport " fmt" func main() { var numbers []int printSlice(numbers) /* 允许向空切片追加元素 */ numbers = append(numbers, 0) printSlice(numbers) /* 向切片添加一个元素 */ numbers = append(numbers, 1) printSlice(numbers) /* 再向切片添加一个元素 */ numbers = append(numbers, 1) printSlice(numbers) /* 同时添加多个元素 */ numbers = append(numbers, 2,3,4) printSlice(numbers)} func printSlice(x []int){ fmt.Printf(" len=%d cap=%d slice=%v " ,len(x),cap(x),x) }

Output:
len=0 cap=0 slice=[] len=1 cap=1 slice=[0] len=2 cap=2 slice=[0 1] len=3 cap=4 slice=[0 1 1] //上面:每次cap改变的时候指向numbers内存的指针都在变化。当在使用 append 的时候,如果 cap==len 了这个时候就会新开辟一块更大内存,然后把之前的数据复制过去(实际go在append的时候放大cap是有规律的。在 cap 小于1024的情况下是每次扩大到 2 * cap ,当大于1024之后就每次扩大到 1.25 * cap 。所以上面的测试中cap变化是 1, 2, 4, 8)。 //下面:len=3+3 cap=4+4 len=6 cap=8 slice=[0 1 1 2 3 4]


    推荐阅读