0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数组中如何增加切片的容量

麦辣鸡腿堡 来源:盼盼编程 作者:盼盼编程 2023-10-09 10:01 次阅读

切片扩容

相对于数组而言,使用切片的一个好处是:可以按需增加切片的容量。

Golang 内置的 append() 函数会处理增加长度时的所有操作细节。要使用 append() 函数,需要一个被操作的切片和一个要追加的值,当 append() 函数返回时,会返回一个包含修改结果的新切片。

函数 append() 总是会增加新切片的长度,而容量有可能会改变,也可能不会改变,这取决于被操作的切片的可用容量。

num := []int{1, 2, 3, 4, 5}
// 创建新的切片,其长度为 2 个元素,容量为 4 个元素

myNum := num[1:3]
// 使用原有的容量来分配一个新元素
// 将新元素赋值为 60
myNum = append(myNum, 60)

执行上面的代码后的底层数据结构如下图所示:

图片

此时因为 myNum 在底层数组里还有额外的容量可用,append() 函数将可用的元素合并入切片的长度,并对其进行赋值。

由于和原始的切片共享同一个底层数组,myNum 中索引为 3 的元素的值也被改动了。

如果切片的底层数组没有足够的可用容量,append() 函数会创建一个新的底层数组,将被引用的现有的值复制到新数组里,再追加新的值,此时 append 操作同时增加切片的长度和容量:

// 创建一个长度和容量都是 4 的整型切片
num := []int{1, 2, 3, 4}

// 向切片追加一个新元素
// 将新元素赋值为 5
myNum := append(num, 5)

当这个 append 操作完成后,newSlice 拥有一个全新的底层数组,这个数组的容量是原来的两倍:

图片

函数 append() 会智能地处理底层数组的容量增长。

在切片的容量小于 1000 个元素时,总是会成倍地增加容量。一旦元素个数超过 1000,容量的增长因子会设为 1.25,也就是会每次增加 25%的容量(随着语言的演化,这种增长算法可能会有所改变)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62590
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40127
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25943
  • 切片
    +关注

    关注

    1

    文章

    22

    浏览量

    8448
收藏 人收藏

    评论

    相关推荐

    关于大容量数组某个元素的定位问题

    请教下,一个采集卡以400k的速率采集数据。在采集过程数组如何获得第600k、第800k个点呢,我尝试用索引数组配合case结构,但发现索引位置变化太慢请问大家有办法吗?
    发表于 06-17 23:49

    labview如何创造一个不断增加数组

    while循环设置为“真时停止”,为什么我按停止后,数组才会不断增加而,而打false则数组增加?不是应该继续的时候才执行while的程
    发表于 01-17 16:56

    数组大小的增加 怎么拉动

    如图 有时候数组增加了一个之后 在怎么拉动数组的控件都只是改变控件外形大小,那个增加输入的小框框就是调不出来
    发表于 07-11 15:58

    数组在内存的存储解析

    数组容量是固定的,只能一次获取或设置一个元素的值,而ArrayList或List的容量可根据需要自动扩充、修改、删除或插入数据。数组可以具有多个维度,而 ArrayList或 Lis
    发表于 01-14 22:22 6090次阅读

    java数组的三种定义方式_java数组的定义及使用方法(推荐)

    java数组是一种很常用的工具,本文将介绍来java数组的三种定义方式以及java数组
    发表于 01-29 09:53 3.2w次阅读

    SystemVerilog数组的赋值、索引和切片

    数组可以作为参数传递给子程序,当数组作为值传递给子程序时,会将这个数组复制一份传递给子程序。
    的头像 发表于 10-20 10:13 5327次阅读

    增加Arduino引脚的电流容量

    电子发烧友网站提供《增加Arduino引脚的电流容量.zip》资料免费下载
    发表于 12-16 10:16 0次下载
    <b class='flag-5'>增加</b>Arduino引脚的电流<b class='flag-5'>容量</b>

    带你了解SystemVerilog的关联数组

    在SystemVerilog,我们知道可以使用动态数组实现数组元素个数的动态分配,即随用随分
    的头像 发表于 06-09 09:46 7463次阅读
    带你了解SystemVerilog<b class='flag-5'>中</b>的关联<b class='flag-5'>数组</b>

    Go切片的内部实现

    切片 Go中提供了一种灵活,功能强悍的内置类型Slices切片(“动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使
    的头像 发表于 10-09 09:43 556次阅读
    Go<b class='flag-5'>切片</b>的内部实现

    golang通过切片创建新的切片

    slice 的第几个元素开始切,j 控制切片的长度(j-i),k 控制切片容量(k-i),如果没有给定 k,则表示切到底层数组的最尾部。下面是几种常见的简写形式: slice [i
    的头像 发表于 10-09 09:48 715次阅读
    golang通过<b class='flag-5'>切片</b>创建新的<b class='flag-5'>切片</b>

    golan共享底层数组切片

    nil 和空切片 有时,程序可能需要声明一个值为 nil 的切片(也称nil切片)。只要在声明时不做任何初始化,就会创建一个 nil 切片。 var num [] int 在 Gola
    的头像 发表于 10-09 09:56 612次阅读
    golan共享底层<b class='flag-5'>数组</b>的<b class='flag-5'>切片</b>

    js判断是否在数组存在

    JavaScript 是一种用于客户端和服务器端编程的脚本语言。它提供了许多内置函数和方法,以便进行数组操作。 在本文中,我们将学习如何使用 JavaScript 来判断一个元素是否存在于数组
    的头像 发表于 11-30 16:23 1138次阅读

    labview怎么查数组相同元素的个数

    要查找LabVIEW数组相同元素的个数,可以使用以下步骤: 创建一个包含要查找的数值的数组。这可以通过手动输入数组元素或从文件/其他数据
    的头像 发表于 12-28 16:42 3504次阅读

    PHP数组的使用方法!

    PHP数组的使用方法! PHP是一种广泛使用的网络编程语言,它的数组功能非常强大且灵活。数组是一种数据结构,它允许我们在单个变量存储多个
    的头像 发表于 01-12 15:11 546次阅读

    数组和链表在内存的区别 数组和链表的优缺点

    数组和链表在内存的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存的存储方式以及优缺点方面存在一些
    的头像 发表于 02-21 11:30 1032次阅读