当前位置:网站首页>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。

边栏推荐
- 吴恩达机器学习系列课程笔记——第十五章:异常检测(Anomaly Detection)
- Transfer of UKlog.dat and QQ, WeChat files
- Location、navigator和History对象
- 6个月测试经验,面试跳槽狮子大开口要18K,只会点点点,给我整无语了。。
- 吴恩达机器学习系列课程笔记——第九章:神经网络的学习(Neural Networks: Learning)
- 如何将PDF中的一部分页面另存为新的PDF文件
- 如何让固定点的监控设备在EasyCVR平台GIS电子地图上显示地理位置?
- Win8.1下QT4.8集成开发环境的搭建
- Research Notes (6) Indoor Path Planning Method Based on Environment Perception
- CaDDN代码调试
猜你喜欢

ClickHouse的客户端命令行参数

MySQL8.0与MySQL5.7区别

Research Notes (8) Deep Learning and Its Application in WiFi Human Perception (Part 2)

HyperLynx中层叠设计实例
![[Study Notes] How to Create an Operation and Maintenance Organizational Structure](/img/9d/037c9d2d66644d6b949721d506be03.png)
[Study Notes] How to Create an Operation and Maintenance Organizational Structure

深蓝学院-视觉SLAM十四讲-第七章作业

Kubernetes中Pod对象学习笔记

Your device is corrupt. It cant‘t be trusted and may not work propely.

1318_将ST link刷成jlink

侦听器watch及其和计算属性、methods方法的总结
随机推荐
数学建模学习(76):多目标线性规划模型(理想法、线性加权法、最大最小法),模型敏感性分析
详解CAN总线:什么是CAN总线?
Pycharm platform import scikit-learn
深度学习基础之batch_size
Deep Blue Academy - Visual SLAM Lecture Fourteen - Chapter 5 Homework
MySQL read-write separation mysql-proxy deployment
分布式系统的一致性与共识(1)-综述
Reinforcement Learning (Chapter 16 of the Watermelon Book) Mind Map
PHP5.6安装ssh2扩展用与执行远程命令
jetracer_pro_2GB AI Kit系统安装使用说明
ADSP21489数据手册表摘要
多主复制下处理写冲突(1)-同步与异步冲突检测及避免冲突
UI自动化测试框架搭建——标记性能较差用例
Nexus 5 phone uses Nexmon tool to get CSI information
OpenCV内阈值处理方法
[Win11] PowerShell cannot activate Conda virtual environment
面试官:大量请求 Redis 不存在的数据,从而打倒数据库,有什么方案?
Deep Blue Academy-Visual SLAM Lecture 14-Chapter 6 Homework
Deep Learning Basics Overfitting, Underfitting Problems, and Regularization
8月1日“海豹数藏”将全网首发民族英雄林则徐《四行行书》数字藏品!
