array

数组二要素:

  • 长度
  • 类型

声明

var arr1 [3]int
var arr2 = [...]int{1, 2, 3, 4, 5, 6}

问题:值拷贝机制下,数组传参造成性能问题

slice

形象化类比:slice和array的关系类似于文件描述符和文件的关系

  1. 从同一数组切出来的切片,共享底层数组,修改会互相影响
  2. 切片的切片同样共享同一底层数组
  3. 动态扩容的实现方式:满了再append,会创建新数组,将元素复制过去。因此每扩容一次,底层数组就会变一次
  4. 最佳实践
    1. 能预估cap的,提供cap。
    2. 传参尽量用slice,不用array。
    3. 传参用切片指针和切片的区别:当函数内append触发扩容后,切片指针可以把扩容反馈到函数外;但是传切片会导致函数外和函数里的底层数组脱离,扩容也就无法反馈到函数外了。

参考

数组Array · Go语言中文文档 (topgoer.com)

Go 向函数传递切片该使用值还是指针? - the_blog - SegmentFault 思否

Go语言精进之路1

文章目录