GO底层——slice

1.简介

slice:切片。依托数组实现,可粗线理解为动态数组。相对比于一般数组,可更方便的进行扩容等操作。

2 slice实现

2.1 slice数据结构

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

array指针指向底层数组,len表示切片长度,cap表示底层数组容量。

2.2 make创建slice

slice := make([]int, 5, 10)所创建Slice

null

该Slice长度为5,即可以使用下标slice[0] ~ slice[4]来操作里面的元素,此时对此slice元素进行操作,只能操作下标0~4,否则下标超出范围。cap为10,表示后续向slice添加新的元素时可以不必重新分配内存,直接使用预留内存即可。

2.3 通过数组创建slice

通过数组创建slice时,slice会与数组共享一部分内存

slice := array[5:7]所创建的Slice,结构如下图所示:

null

切片从数组array[5]开始,到数组array[7]结束(不含array[7]),即切片长度为2,数组后面的内容都作为切片的预留内存,即capacity为5。

2.4 slice扩容

通过append向slice添加元素时,如果slice预留内存空间足够,则直接添加,对应长度变长。如果slice预留内存空间不足,则slice重新分配一个更大的内存,原slice的数据copy进新slice,新元素进行添加,对应长度变长,返回新slice。

slice扩容原则:

slice容量小于1024,扩容至原来的2倍

slice容量大于1024,扩容至原来的1.25倍

注意:slice的copy过程中不发生扩容。(长度为10的slice拷贝到长度为5的slice时,只会拷贝5个元素)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

音光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值