Go成神之路——切片


一、初识切片


切片是go语言一个富有特色的数据结构,它长度可变,切片中的每个元素是同一类型。

切片结构

切片由三部分构成,data、len和cap

data是一个指针,len是切片的实际长度,cap是切片的最大容量。data指针指向切片首元素的底层数据存放地址。

初始化切片的几种方式
// 创建切片变量
var slice0 []int
// 下面这两个易混淆
slice1 := []int{1, 2, 3, 4} // 这种方式是声明一个切片
arr := [...]int{1, 2, 3, 4} // 这种方式是声明一个数组
// 利用make创建
slice2 := make([]int, 3, 3)
var slice3 = make([]int, 5, 7)

一般通过 []Type 声明一个切片,Type是切片中元素的类型。
make函数用于同时指定元素类型,len和cap,初始化时cap必须大于等于len。
若不指定cap,如第二种创建方式,那么cap默认和len相等。

截取切片

初始化一个切片后可以取出其中连续的一部分。

slice := []int{1, 2, 3, 4}
slice1 := slice[1:3]

这样截取完后的slice1的内容为{2,3},说明 [1:3] 包括索引1但不包括索引3
值得注意的是,截取后的切片指针仍指向原切片的底层数据。这也意味着修改截取后切片的元素同时修改了原切片的元素。


二、切片的扩容机制


容量不够扩容二倍是一个最基础的认识,但其实go对slice的扩容机制还是比较复杂的。

第一重判断:原容量扩容两倍后是否满足需要

若原容量扩容两倍后仍不能满足需要,那么新容量值等于能够满足需要的申请容量值。
例如,len=4,cap=4,append一个len=5的切片后,4+5=9 > 4*2=8,那么新的容量值就是10。

第二重判断:原切片长度是否大于等于1024

能进入这重判断意味着oldcap扩容两倍后能满足需要。
若oldlen<1024,那么newcap=oldcap*2,正常扩容。
若oldcap>=1024,那么令newcap=oldcap,然后newcap+=newcap / 4,这一步一直循环直到newcap达到满足需要的容量时。

第三重判断:是否溢出

能进入这重判断意味着oldcap>=1024。
newcap在以1/4的速度增长时,可能会超出数据类型(如int)的最大值,这样就溢出了。
此时就让newcap等于能满足需要的申请容量(类似于1中)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值