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

边栏推荐
猜你喜欢

8月1日“海豹数藏”将全网首发民族英雄林则徐《四行行书》数字藏品!

安装部署 Kubernetes 仪表板(Dashboard)

复制延迟案例(3)-单调读
![[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

吴恩达机器学习系列课程笔记——第十六章:推荐系统(Recommender Systems)

强化学习(西瓜书第16章)思维导图

数据复制系统设计(2)-同步复制与异步复制

吴恩达机器学习系列课程笔记——第十五章:异常检测(Anomaly Detection)

7亿听众背后的在线音频掘金故事

可视水印的实现——1使用加法实现(add,+)
随机推荐
高等数学(第七版)同济大学 总习题三(前10题) 个人解答
无主复制系统(2)-读写quorum
SCI期刊最权威的信息查询步骤!
8月1日“海豹数藏”将全网首发民族英雄林则徐《四行行书》数字藏品!
Deep Blue Academy - Fourteen Lectures of Visual SLAM - Chapter 4 Homework
【FreeRTOS】12 任务通知——更省资源的同步方式
深蓝学院-手写VIO作业-第一章
三维目标检测之OpenPCDet环境配置及demo测试
数学建模学习(76):多目标线性规划模型(理想法、线性加权法、最大最小法),模型敏感性分析
CaDDN代码调试
视觉SLAM十四讲--第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤)
MySQL read-write separation mysql-proxy deployment
SCI writing strategy - with common English writing sentence patterns
Jetson Nano 2GB Developer Kit Installation Instructions
多主复制的适用场景(1)-多IDC
深蓝学院-手写VIO作业-第二章
迭代器与生成器
Deep Blue Academy-Visual SLAM Lecture 14-Chapter 6 Homework
被大厂强制毕业,两个月空窗期死背八股文,幸好上岸,不然房贷都还不上了
吴恩达机器学习系列课程笔记——第七章:正则化(Regularization)
