技术干货,第一时间推送
一、先做个小实验
发现slice在进行append操作时会跟据原来的slice容量,如果append完成后新slice的容量超过原来slice的容量,则需要扩容,并且将旧的slice数据全部迁移到新的slice开辟的地址里。
二.源码分析
在runtime目录下找到slice.go,定位到growslice(et *_type, old slice, cap int)这个函数
三.slice作为函数参数
函数中的形参slice是实参的拷贝,指向切片的指针不同,由于sice没有扩容,函数里面的slice和主函数的实参slice指向的数组地址是一样的
函数中的形参slice是实参的拷贝,指向切片的指针不同,由于sice扩容了,函数里面的slice和主函数的实参slice指向的数组地址是不一样的
四.总结
不要轻易的对切片append,如果新的切片容量比旧的大的话,需要进行growslice操作,新的地址开辟,数据拷贝
尽量对切片设置初始容量值以避免growslice,类似make([]int,0,100)
切片是一个结构体,保存着切片的容量,实际长度以及数组的地址
切片作为函数参数传入会进行引用拷贝,生成一个新的切片,指向同一个数组
-解读源码-
知其然并知其所以然
领取专属 10元无门槛券
私享最新 技术干货