多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# **切片的自动扩容** 切片有两个主要的属性:**容量(cap)**和**长度(len)**,而且这两个属性的值往往是不一样的。一个与数组拥有相同数量元素的切片,二者的长度是相同的,且均可以通过函数`len()`获得。切片的容量是指切片能够容纳的元素空间,可以通过`cap()`函数获得。由于切片的大小是动态变化的,如果一个切片超出了其设置的容量,Go会自动将该切片的长度变为原来的两倍,以存放超出的元素。 简单来说,当切片的容量和长度相等时,你再往该切片追加一个元素,当然长度增加1,但是切片的容量会变为原来的两倍。然而这种操作可能对于小的切片效果比较好,对于大型切片来说会占用的内存会超出你预期。 下面的代码`lenCap.go`分三部分,清楚地阐述了切片的容量与长度的变化规律,第一部分代码: ```go package main func printSlice(x []int) { for _, number := range x { fmt.Println(number, " ") } fmt.Println() } ``` `printSlice()`打印一个slice的所有元素。 第二部分代码: ```go func main() { aSlice := []int{-1, 0, 4} fmt.Printf("aSlice: ") printSlice(aSlice) fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice)) aSlice = append(aSlice, -100) fmt.Printf("aSlice: ") printSlice(aSlice) fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice)) ``` 这部分代码中,我们往aSlice中添加元素以出发其长度和容量的变化。 第三部分代码: ```go aSlice = append(aSlice, -2) aSlice = append(aSlice, -3) aSlice = append(aSlice, -4) printSlice(aSlice) fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice)) } ``` 以上代码的执行结果是: ```bash $ go run lenCap.go aSlice: -1 0 4 Cap: 3, Length: 3 aSlice: -1 0 4 -100 Cap: 6, Length: 4 -1 0 4 -100 -2 -3 -4 Cap: 12, Length: 7 ``` 正如输出所示,初始的切片长度和容量均是3,在添加一个元素之后,其长度变为4,然后容量变为6。继续往切片中追加元素,其长度变为7,容量再一次翻倍即变为12。