持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
生命不息,学习不止
题外话
今天周四了,今天早上有点刺激,下了楼发现没有小黄车了,没有办法,我跑着去地铁站呗,你别说,早上起来跑一跑还挺舒服,但就是导致上午有点犯困啊~
废话不多说,上货
上回讲了一下unsafe这个包和他几个关键性的函数,本来想讲讲string常用函数,但我发现很多都涉及到了切片,那今天就先来讲讲slice切片
slice切片
slice大家都不陌生,无论是项目开发还是刷算法题都是比较常用的数据结构,基本也都知道slcie的底层是数组
源码在runtime/slice.go 具体结构定义如下
array 指向底层数组的指针,没啥说的
len 底层数组的长度,长度不固定,是动态的,扩容时发生改变
cap 切片的容量,容量大于等于长度,不然报错
这里要注意一下,因为array 是指针,所以意味着多个slice底层的array 可以指向同一个底层数组,这代表相互之间会有影响
slice切片的拷贝
之前在其他语言经常提到深拷贝与浅拷贝,其实slice也涉及深浅拷贝,主要就体现在copy数组的修改对原数组的影响
举个例子
可以看到单纯的地址指向是浅拷贝,copy数组的修改会导致原数组跟着变更
而copy方法底层采用了runtime.memmove方法,是将指向的内存区域的值copy到对方的指向的内存区域中
但🈶一点要注意,因为是拷贝整个内存区域中的一部分,所以资源的消耗是比较大的
你以为结束了
下一篇我们讲一下slice切片的扩容机制
大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划!