go-数组与切片
array
数组二要素:
- 长度
- 类型
声明
var arr1 [3]int
var arr2 = [...]int{1, 2, 3, 4, 5, 6}
问题:值拷贝机制下,数组传参造成性能问题
slice
形象化类比:slice和array的关系类似于文件描述符和文件的关系
- 从同一数组切出来的切片,共享底层数组,修改会互相影响
- 切片的切片同样共享同一底层数组
- 动态扩容的实现方式:满了再append,会创建新数组,将元素复制过去。因此每扩容一次,底层数组就会变一次
- 最佳实践
- 能预估cap的,提供cap。
- 传参尽量用slice,不用array。
- 传参用切片指针和切片的区别:当函数内append触发扩容后,切片指针可以把扩容反馈到函数外;但是传切片会导致函数外和函数里的底层数组脱离,扩容也就无法反馈到函数外了。
参考
数组Array · Go语言中文文档 (topgoer.com)
Go 向函数传递切片该使用值还是指针? - the_blog - SegmentFault 思否
Go语言精进之路1
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。