上一篇:go学习(2021-09-30 14:09:54)
文章大纲

go学习:切片append一个元素,capacity却翻倍了

2021-10-08 16:36:34

今天学习go语言的切片部分,测试时突然发现,我在给一个切片append一个元素后,切片的capacity却翻倍了。

于是就打算找下其中原因。


package main

import "fmt"

func main() {
var ori []int = make([]int, 3, 5)
fmt.Printf("ori: ")
printSlice(ori)
var s []int = ori[:4]
fmt.Printf("s: ")
printSlice(s)
s1 := append(s, 1)
fmt.Printf("s1: ")
printSlice(s1)
s2 := make([]int, len(s), cap(s)*2)
copy(s2, s)
fmt.Printf("s2: ")
printSlice(s2)
}

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

当s切片截取的是4个元素时(从索引0到3),此时添加一个元素,capacity容纳空间是不变的,仍然是5。

当s切片截取的是5个元素时(从索引0到4),此时添加一个元素,切片就有6个元素了,由于切片原本最大容纳空间是5,所以底层会自动将capacity提升一

倍。

ori: len=3 cap=5 slice=[0 0 0]
s: len=4 cap=5 slice=[0 0 0 0]
s1: len=5 cap=5 slice=[0 0 0 0 1]
s2: len=4 cap=10 slice=[0 0 0 0]
将如下代码换成:
var s []int = ori[:5]

capacity结果就翻倍了:

ori: len=3 cap=5 slice=[0 0 0]
s: len=5 cap=5 slice=[0 0 0 0 0]
s1: len=6 cap=10 slice=[0 0 0 0 0 1]
s2: len=5 cap=10 slice=[0 0 0 0 0]


上一篇:go学习(2021-09-30 14:09:54)
我要评论
评论列表