广告
返回顶部
首页 > 资讯 > 后端开发 > GO >go的切片扩容机制详解
  • 408
分享到

go的切片扩容机制详解

go切片扩容 2023-05-14 08:05:57 408人浏览 独家记忆
摘要

切片的扩容策略?如何扩容? 扩容策略:如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。总容量从原来的1个翻倍到现在的2个。 一旦元素个数超过 1024 个元素,那

切片的扩容策略?如何扩容?

扩容策略:如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。总容量从原来的1个翻倍到现在的2个。

一旦元素个数超过 1024 个元素,那么增长因子就变成 1.25 ,即每次增加原来容量的四分之一。

注意:扩容扩大的容量都是针对原来的容量而言的,而不是针对原来数组的长度而言的。

举一个扩容策略例子:

func main() {
    slice := []int{10, 20, 30, 40}
    newSlice := append(slice, 50)
    fmt.Printf("Before slice = %v, Pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))
    fmt.Printf("Before newSlice = %v, Pointer = %p, len = %d, cap = %d\n", newSlice, &newSlice, len(newSlice), cap(newSlice))
    newSlice[1] += 10
    fmt.Printf("After slice = %v, Pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))
    fmt.Printf("After newSlice = %v, Pointer = %p, len = %d, cap = %d\n", newSlice, &newSlice, len(newSlice), cap(newSlice))
}

// result 
Before slice = [10 20 30 40], Pointer = 0xc4200b0140, len = 4, cap = 4
Before newSlice = [10 20 30 40 50], Pointer = 0xc4200b0180, len = 5, cap = 8
After slice = [10 20 30 40], Pointer = 0xc4200b0140, len = 4, cap = 4
// 相加的数是在新的切片上相加的
After newSlice = [10 30 30 40 50], Pointer = 0xc4200b0180, len = 5, cap = 8

 从结果我们可以看出,新切片和之前的切片已经不同了,因为新的切片更改了一个值,并没有影响到原来的数组,新切片指向的数组是一个全新的数组,并且cap容量也发生了变化。

那么到底是新数组还是老数组呢?
扩容之后数组就一定是新的吗?其实是分两种情况。

第一种情况:

func main() {
    array := [4]int{10, 20, 30, 40}
    slice := array[0:2]
    newSlice := append(slice, 50)
    fmt.Printf("Before slice = %v, Pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))
    fmt.Printf("Before newSlice = %v, Pointer = %p, len = %d, cap = %d\n", newSlice, &newSlice, len(newSlice), cap(newSlice))
    newSlice[1] += 10
    fmt.Printf("After slice = %v, Pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))
    fmt.Printf("After newSlice = %v, Pointer = %p, len = %d, cap = %d\n", newSlice, &newSlice, len(newSlice), cap(newSlice))
    fmt.Printf("After array = %v\n", array)
}

// result
    Before slice = [10 20], Pointer = 0xc4200c0040, len = 2, cap = 4
    Before newSlice = [10 20 50], Pointer = 0xc4200c0060, len = 3, cap = 4
    After slice = [10 30], Pointer = 0xc4200c0040, len = 2, cap = 4
    After newSlice = [10 30 50], Pointer = 0xc4200c0060, len = 3, cap = 4
    After array = [10 30 50 40]

通过这个结果可以明显的看出,修改新切片的值居然影响到了老切片的值了,扩容以后并没有新建一个新的数组,并且append操作也改变了原来数组的值,如果原数组上有多个切片,那么这些切片都会影响,产生了莫名的bug!

这种情况也极容易出现在字面量创建切片时候,第三个参数 cap 传值的时候,如果用字面量创建切片,cap 并不等于指向数组的总容量,那么这种情况就会发生。

注意:建议用字面量创建切片的时候,cap 的值一定要保持清醒,避免共享原数组导致的 bug。

第二种情况:

第二种情况就是扩容策略的例子了,在扩容之后产生了新的切片,因为原数组的容量达到了最大值,再扩容都会开出一片新的内存,把原来的值拷贝过来,再进行后续操作也不会影响原数组。

总结:时刻保持cap的清醒,推荐使用第二种情况的扩容策略

到此这篇关于Go的切片扩容机制详解的文章就介绍到这了,更多相关go 切片扩容 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: go的切片扩容机制详解

本文链接: https://www.lsjlt.com/news/202892.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go的切片扩容机制详解
    切片的扩容策略?如何扩容? 扩容策略:如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。总容量从原来的1个翻倍到现在的2个。 一旦元素个数超过 1024 个元素,那...
    99+
    2023-05-14
    go 切片扩容
  • go的切片扩容机制是什么
    本篇内容主要讲解“go的切片扩容机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go的切片扩容机制是什么”吧!切片的扩容策略?如何扩容?扩容策略:如果切片的容量小于 1024 个元素,于...
    99+
    2023-07-05
  • 一文详解Go语言切片是如何扩容的
    目录声明和初始化扩容时机源码分析go1.17go1.18内存对齐总结在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,...
    99+
    2023-05-15
    Go语言切片扩容 Go语言切片 Go 切片扩容 Go 切片
  • 浅谈Golang 切片(slice)扩容机制的原理
    我们知道 Golang 切片(slice) 在容量不足的情况下会进行扩容,扩容的原理是怎样的呢?是不是每次扩一倍?下面我们结合源码来告诉你答案。 一、源码 Version : go...
    99+
    2022-11-12
  • Go语言切片是怎么扩容的
    本篇内容主要讲解“Go语言切片是怎么扩容的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言切片是怎么扩容的”吧!在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。切片是一...
    99+
    2023-07-06
  • 详解ArrayList的扩容机制
    目录一、ArrayList 了解过吗?它是啥?有啥用?二、ArrayList 如何指定底层数组大小的三、数组的大小一旦被规定就无法改变四、ArrayList 具体是怎么添加数...
    99+
    2022-11-12
  • Go中的nil切片和空切片区别详解
    Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 ...
    99+
    2022-06-07
    nil GO
  • 详解Go语言中切片的长度与容量的区别
    目录切片的声明切片的长度和容量切片追加元素后长度和容量的变化append 函数切片的源代码学习切片的结构体切片的扩容总结切片的声明 切片可以看成是数组的引用(实际上切片的底层数据结构...
    99+
    2022-11-11
  • JDK8中的HashMap初始化和扩容机制详解
    一、HashMap初始化方法 HashMap() 不带参数,默认初始化大小为16,加载因子为0.75; HashMap(int initialCapacity) 指定初始化大小; H...
    99+
    2022-11-12
  • GO语言的数组array与切片slice详解
    GO语言数组(array) 在GO语言中,数组是用于存储相同数据类型的集合,数组长度必须是一个常量表达式,且是一个非负数GO语言中的数组是一种值类型,下文会介绍 GO语言数组定义的格...
    99+
    2022-12-19
    GO语言的数组array GO语言切片slice GO语言数组定义赋值 GO语言多维数组 GO语言创建切片 GO语言复制与追加切片
  • Go语言数组和切片的区别详解
    目录数组声明以及初始化函数参数切片声明以及初始化函数参数总结参考文章:在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 另外...
    99+
    2023-05-14
    Go 数组和切片
  • 怎么理解List的扩容机制
    这篇文章主要讲解了“怎么理解List的扩容机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解List的扩容机制”吧!一:背景 讲故事在前一篇大内存排查中,我们看到了Dictionar...
    99+
    2023-06-01
  • hashmap的扩容机制怎么理解
    今天小编给大家分享一下hashmap的扩容机制怎么理解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。hashmap的扩容机制...
    99+
    2023-07-05
  • python切片复制列表的知识点详解
    1、不指定开始和结束的索引[:],这样得到的切片就可以包含整个列表,然后给切片一个新的变量,从而实现复制列表。 2、创建原始列表的副本,两个列表的操作不会影响。 实例 names...
    99+
    2022-11-12
  • add方法理解ArrayList的扩容机制
    目录ArrayList的构造方法(前置知识)ArrayList的add方法(理解扩容机制)add 添加元素得到最小扩容量判断是否需要扩容扩容方法ArrayList的构造方法(前置知识...
    99+
    2023-03-07
    add方法ArrayList扩容 add ArrayList
  • 详解Go语言中数组,切片和映射的使用
    目录1.Arrays (数组)2.切片2.1 make创建切片3.映射MapArrays (数组), Slices (切片) 和 Maps (映射) 是常见的一类数据结构 1.Arr...
    99+
    2022-11-13
  • Go语言的反射机制详解
    反射是语言里面是非常重要的一个特性,我们经常会看见这个词,但是对于反射没有一个很好的理解,主要是因为对于反射的使用场景不太熟悉。 一、理解变量的内在机制 1.类型信息,元信息,是预先...
    99+
    2022-11-13
  • 关于ArrayList的动态扩容机制解读
    目录1. 前言2. ArrayList 的动态扩容机制2.1. ArrayList 的主要属性2.2. ArrayList 的构造器2.3. ArrayList 的动态扩容3. 小结...
    99+
    2022-11-13
    ArrayList的扩容机制 动态扩容机制 ArrayList动态扩容机制
  • Go语言基础切片的创建及初始化示例详解
    目录概述语法一、创建和初始化切片make字面量二、使用切片赋值和切片切片增长遍历切片总结总示例示例一  两个slice是否相等示例二  两个数字是否包含概述 ...
    99+
    2022-11-12
  • 怎么用add方法理解ArrayList的扩容机制
    这篇文章主要介绍“怎么用add方法理解ArrayList的扩容机制”,在日常操作中,相信很多人在怎么用add方法理解ArrayList的扩容机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用add方法理...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作