Go 切片的扩容规则是怎么样的

news/2024/10/22 21:06:57

切片是动态数组,容量是根据元素动态增加的。

本来想看看源码怎么写的,发现切片追加元素的方法是内置的,看起来还挺麻烦

源码位于 builtin.go 中:

// The append built-in function appends elements to the end of a slice. If  
// it has sufficient capacity, the destination is resliced to accommodate the  
// new elements. If it does not, a new underlying array will be allocated.  
// Append returns the updated slice. It is therefore necessary to store the  
// result of append, often in the variable holding the slice itself:  
//  
//  slice = append(slice, elem1, elem2)  
//  slice = append(slice, anotherSlice...)  
//  
// As a special case, it is legal to append a string to a byte slice, like this:  
//  
//  slice = append([]byte("hello "), "world"...)  
func append(slice []Type, elems ...Type) []Type

那么,就用简单的方法来推算规则。编写下面的单测代码,循环 100 次,每次追加 1个元素,看看切片的长度和容量的变化规律是什么。

func TestSliceAppend(t *testing.T) {  slice := make([]int, 0)  t.Logf("len:%d cap:%d slice:%v", len(slice), cap(slice), slice)  for i := 0; i < 100; i++ {  slice = append(slice, i)  t.Logf("len:%d cap:%d slice:%v", len(slice), cap(slice), slice)  }  
}

输出结果:

slice_test.go:54: len:0 cap:0 slice:[]
slice_test.go:57: len:1 cap:1 slice:[0]
slice_test.go:57: len:2 cap:2 slice:[0 1]
slice_test.go:57: len:3 cap:4 slice:[0 1 2]
slice_test.go:57: len:4 cap:4 slice:[0 1 2 3]
slice_test.go:57: len:5 cap:8 slice:[0 1 2 3 4]
slice_test.go:57: len:6 cap:8 slice:[0 1 2 3 4 5]
slice_test.go:57: len:7 cap:8 slice:[0 1 2 3 4 5 6]
slice_test.go:57: len:8 cap:8 slice:[0 1 2 3 4 5 6 7]
slice_test.go:57: len:9 cap:16 slice:[0 1 2 3 4 5 6 7 8]
slice_test.go:57: len:10 cap:16 slice:[0 1 2 3 4 5 6 7 8 9]
slice_test.go:57: len:11 cap:16 slice:[0 1 2 3 4 5 6 7 8 9 10]
slice_test.go:57: len:12 cap:16 slice:[0 1 2 3 4 5 6 7 8 9 10 11]
slice_test.go:57: len:13 cap:16 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12]
slice_test.go:57: len:14 cap:16 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13]
slice_test.go:57: len:15 cap:16 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
slice_test.go:57: len:16 cap:16 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
slice_test.go:57: len:17 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
slice_test.go:57: len:18 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
slice_test.go:57: len:19 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]
slice_test.go:57: len:20 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
slice_test.go:57: len:21 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
slice_test.go:57: len:22 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21]
slice_test.go:57: len:23 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22]
slice_test.go:57: len:24 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
slice_test.go:57: len:25 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
slice_test.go:57: len:26 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25]
slice_test.go:57: len:27 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26]
slice_test.go:57: len:28 cap:32 slice:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27]
...

这里没有都粘贴过来,容量的规则是每次是原来的 2 倍。

Over!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74807.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Maven的学习

Maven 安装与配置 今天我们来学习一下Maven,Maven就相当于一个管理的工具,原理就是使用一个插件,这个插件由多个jar包构成。 在一个公司的项目开发过程中,一个大的项目通常被分为好几个小的模块,由不同的人去完成,但是不同的人在开发的过程中,使用的组件,jar包难免会有…

jdk8中文文档及安卓阅读器

例:下载链接: 文档(密码:76nh) 软件(密码:5wrj) 原文链接: http://466dd.com

7-1计算阶乘和【PTA嵌套循环程序设计】

嵌套循环程序设计 7-1计算阶乘和#include<stdio.h>int f(int a){int sum = 1;for(int i=1;i<=a;i++){sum *= i;}return sum;}//构造N!函数int main(){int N = 0,sum = 0;//初始化scanf("%d",&N);if(N>1){for(int i=1;i<=N;i++){sum += f(i);//实…

从认识 Kubernetes 开始

你也说,我也说,那什么是 K8s 呢?Author: ACatSmiling Since: 2024-10-21认识 Kubernetes 什么是 Kubernetes 官方网站:https://kubernetes.io Kubernetes,是 Google 严格保密十几年的秘密武器 Borg 系统的一个开源版本,于 2014 年 9 月发布第一个版本,2015 年 7 月发布第…

java的三大程序结构

JAVA的三大程序结构 一:顺序结构 程序走上执行到下。 二:选择结构 if单选择结构 if(布尔表达式){ //如果布尔表达式的值为ture则执行{}里的语句块 } public class IfDemo01 {public static void main(String[] args) {//接收键盘输入Scanner scanner = new Scanner(System.…

CSP模拟赛 #42

#40 懒得写了,#41 题目质量过低。A 有 \(n\) 张长度为 \(m\) 的纸条,每张纸条有 \(k_i\) 个位置有小写字母,其他位置透明。你需要合理从上到下排列这些纸条,使得最终在上方看到的字符串为 \(s\),保证对于每个位置,至少一张纸条在该位置有一个字母。给出方案或无解。 \(1\…

markdown转pdf,方法总结

总结使用1. VScode插件Markdown Preview Enhanced。格式是正确的。但是无法批处理和指令处理2. pandoc --pdf-engine=typst。无法导出粗体和斜体需求 markdown格式转为pdf我遇到的: 1. 我现在想把多个八股文文档(GitHub项目里的 scutan90/DeepLearning-500-questions: 深度学…

苦寻多日,终于搞定了地形切片,向大家安利一下这款超简单的免费GIS工具箱

概述 地形切片是将大范围的地形数据分割成小块(切片)进行存储和展示的技术,常用于高效的三维地形可视化和动态加载。在实际操作中,可以通过GISBox等工具进行地形切片处理。今天和大家安利的GISBox 是一个用于GIS模型切片、服务分发的免费GIS工具箱,其中包括了支持地形切片…