[Golang]Slice切片

本文详细讲解了切片的数据结构组成,包括元素存址、长度和容量,并通过实例阐述了int和string切片的初始化、append操作以及容量调整规则。重点介绍了如何理解切片底层机制,以及其在数组和动态扩展中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问:切片是什么结构?

slice组成

slice 由三个部分组成:

data:元素存哪里 len:存了多少个元素 cap:可以存多少个元素

初始化int切片
var ints []int 

初始化变量ints,data=nil,len=0,cap=0


var ints []int = make([]int,2,5)

data 指向第一个元素,长度为2.且都为0,最大容量为5
在此基础上append:
PS:超出容量的append,会使cap翻倍(具体规则:1.如果扩容前容量翻倍<所需最小容量=> 新容量 = 所需最小容量;2.否则:长度小于1024直接翻倍,大于等于1024,扩容1/4)
PS:超出长度的读取不被允许


var ints []int = make([]int,2,5)
ints = append(ints,1)

[0,0,1]

初始化字符串切片
ps := new([]string)

new一个字符串切片同样会分配这三部分结构,但它不负责底层数组的分配,所以data=nil,len=0,cap=0
new的返回值就是slice结构的起始地址,所以ps呀就是个地址


此时,这个slice变量还没有底层数组,所以下面这个操作不被允许:

(*ps)[0]="eggo"

通过append的方式添加元素:

*ps = append (*ps,"eggo")

append会给slice开辟底层数组,data=底层数组起始地址+字节长度=4,len=1,cap=1

数组与切片

data不是必须指向数组开头

arr := [10]int{0,1,2,3,4,5,6,7,8,9}
var s1 []int = arr[1:4]
var s2 []int = arr[7:]

s1的元素使arr索引1到4,左闭右开(data:&arr[1],len:3,cap=9(从data开始到底层数组结束))
.
s2的元素使arr索引7到9,左闭右开(data:&arr[7],len:3,cap=3(从data开始到底层数组结束))

slice访问和修改的都是底层数组的元素,s1可以通过append来拓展(未超过底层数组时候,在原底层数组上修改,超过后则开辟新数组并修改)。
此时给s2添加元素,会开辟新数组,将原来的值copy过来,容量翻倍cap=6

新cap个元素占用内存

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值