当前位置:网站首页>Go 语言是如何实现切片扩容的?【slice】
Go 语言是如何实现切片扩容的?【slice】
2022-08-02 03:54:00 【JavaPub-rodert】
博主介绍: 自媒体 JavaPub 独立维护人,全网粉丝15w+,csdn博客专家、java领域优质创作者,51ctoTOP10博主,知乎/掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、
GoLang
技术领域和副业。
在这个百年未有之大变局之际,此文送给需要升值加薪的雇佣者。
先说结论:
当增加新的元素的时候,超过了容量,但是容量大小小于1024的时候 , 是2倍扩容;
当新增元素 , 超过了容量 , 并且容量大于1024 , 是1.25倍扩容。
什么是切片?
slice(切片)代表变长的序列,序列中每个元素都有相同的类型。
一个slice类型一般写作[]T,其中T代表slice中元素的类型。
slice的语法和数组很像,只是没有固定长度而已。
数组和slice之间有着紧密的联系。一个slice是一个轻量级的数据结构,提供了访问数组子序列 (或者全部)元素的功能,slice的底层引用一个数组对象。
切片的构成
一个slice由三个部分构成:指针、长度和容量。
指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一定就是数组的第一个元素。
长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。
内置的len()和cap()函数分别返回slice的长度和容量。
多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠。
切片的操作
slice的切片操作s[i:j],其中0 ≤ i≤ j≤ cap(s),用于创建一个新的slice,引用s的从第i个元素开始到第j-1个元素的子序列。新的slice只有j-i个元素。
如果i位置的索引被省略的话将使用0代替。
如果j位置的索引被省略的话将使用len(s)代替
如果切片操作超出cap(s)的上限将导致一个panic异常,但是超出len(s)则是意味着扩展了slice,因为新slice的长度会变大。
另外,字符串的切片操作和[]byte字节类型切片的切片操作是类似的。都写作x[m:n],并且都是返回一个原始字节系列的子序列,底层都是共享之前的底层数组,因此这种操作都是常量时间复杂度。x[m:n]切片操作对于字符串生成一个新字符串。
因为slice值包含指向第一个slice元素的指针,因此向函数传递slice将允许在函数内部修改底层数组的元素。换句话说,复制一个slice只是对底层的数组创建了一个新的slice别名。
切片的比较
和数组不同的是,slice之间不能比较,因此我们不能使用==操作符来判断两个slice是否含有全部相等元素。不过标准库提供了高度优化的bytes.Equal函数来判断两个字节型slice是否相等([]byte),但是对于其他类型的slice,我们必须自己定义函数来比较每个元素。
slice唯一合法的比较操作是和nil比较。
切片的零值
一个零值的slice等于nil。一个nil值的slice并没有底层数组。一个nil值的slice的长度和容量都是0,但是也有非nil值的slice的长度和容量也是0的,例如[]int{}或make([]int, 3)[3:]。与任意类型的nil值一样,我们可以用[]int(nil)类型转换表达式来生成一个对应类型slice的nil值。
如果你需要测试一个slice是否是空的,使用 len(s) == 0 来判断,而不应该用 s == nil来判断。除了和nil相等比较外,一个nil值的slice的行为和其它任意0长度的slice一样;例如reverse(nil)也是安全的。除了文档已经明确说明的地方,所有的Go语言函数应该以相同的方式对待nil值的slice和0长度的slice。
边栏推荐
- The CCF brush topic tour - the first topic
- 科研笔记(八) 深度学习及其在 WiFi 人体感知中的应用(下)
- 复制延迟案例(2)-读己之写
- 【FreeRTOS】12 任务通知——更省资源的同步方式
- 日本痴汉打赏女主播1.5亿,结果。。。
- Deep Blue Academy - 14 Lectures on Visual SLAM - Chapter 7 Homework
- Jetson Nano 2GB Developer Kit 安装说明
- 分布式系统的一致性与共识(1)-综述
- SCI写作攻略——附带常见英语写作句式
- 从事功能测试1年,裸辞1个月,找不到工作的“我”怎么办?
猜你喜欢
深度学习基础之批量归一化(BN)
ADSP21489数据手册表摘要
1318_将ST link刷成jlink
How to save a section of pages in a PDF as a new PDF file
Computer Basics
CaDDN paper reading of monocular 3D target detection
Andrew Ng's Machine Learning Series Course Notes - Chapter 18: Application Example: Image Text Recognition (Application Example: Photo OCR)
【学习笔记】如何打造运维组织架构
剩余参数、数组对象的方法和字符串扩展的方法
强化学习(西瓜书第16章)思维导图
随机推荐
[Study Notes] How to Create an Operation and Maintenance Organizational Structure
深蓝学院-视觉SLAM十四讲-第五章作业
多数据中心操作和检测并发写入
OpenPCDet environment configuration of 3 d object detection and demo test
数据复制系统设计(2)-同步复制与异步复制
深蓝学院-手写VIO作业-第一章
论人生自动化
CaDDN paper reading of monocular 3D target detection
Nexus 5 phone uses Nexmon tool to get CSI information
列表总结
复制延迟案例(2)-读己之写
Location、navigator和History对象
Andrew Ng's Machine Learning Series Course Notes - Chapter 18: Application Example: Image Text Recognition (Application Example: Photo OCR)
Kubernetes中Pod对象学习笔记
无主复制系统(2)-读写quorum
数学建模学习(76):多目标线性规划模型(理想法、线性加权法、最大最小法),模型敏感性分析
三维目标检测之ROS可视化
吴恩达机器学习系列课程笔记——第九章:神经网络的学习(Neural Networks: Learning)
温暖的世界
[Win11] PowerShell cannot activate Conda virtual environment