Golang slice 使用及源码分析

技术干货,第一时间推送

一、先做个小实验

发现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)

切片是一个结构体,保存着切片的容量,实际长度以及数组的地址

切片作为函数参数传入会进行引用拷贝,生成一个新的切片,指向同一个数组

-解读源码-

知其然并知其所以然

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200311A09Y2500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券