Golang底层原理解析(4)—— slice切片底层解析

122 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

生命不息,学习不止

题外话

今天周四了,今天早上有点刺激,下了楼发现没有小黄车了,没有办法,我跑着去地铁站呗,你别说,早上起来跑一跑还挺舒服,但就是导致上午有点犯困啊~

image.png

废话不多说,上货

在这里插入图片描述

上回讲了一下unsafe这个包和他几个关键性的函数,本来想讲讲string常用函数,但我发现很多都涉及到了切片,那今天就先来讲讲slice切片

slice切片

slice大家都不陌生,无论是项目开发还是刷算法题都是比较常用的数据结构,基本也都知道slcie的底层是数组

源码在runtime/slice.go 具体结构定义如下

image.png

array 指向底层数组的指针,没啥说的

len 底层数组的长度,长度不固定,是动态的,扩容时发生改变

cap 切片的容量,容量大于等于长度,不然报错

image.png

这里要注意一下,因为array 是指针,所以意味着多个slice底层的array 可以指向同一个底层数组,这代表相互之间会有影响

slice切片的拷贝

之前在其他语言经常提到深拷贝与浅拷贝,其实slice也涉及深浅拷贝,主要就体现在copy数组的修改对原数组的影响

举个例子

image.png

可以看到单纯的地址指向是浅拷贝,copy数组的修改会导致原数组跟着变更

而copy方法底层采用了runtime.memmove方法,是将指向的内存区域的值copy到对方的指向的内存区域中

但🈶一点要注意,因为是拷贝整个内存区域中的一部分,所以资源的消耗是比较大的

你以为结束了

下一篇我们讲一下slice切片的扩容机制

在这里插入图片描述

大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划! 在这里插入图片描述