Golang 的Array与Slice

Array

  1. 数组是值类型,赋值和传参都会复制整个数组,而不是指针
  2. 数组长度必需是常量,且是类型的组成部分。[2]int和[3]int是两个不同类型
  3. 支持"=="与"!="操作符,因其内存总是被初始化的
  4. 指针数组[n]*T 与 数组指针 *[n]T
推荐

值拷贝会千万性能问题,通常会使用Slice或者数组指针

Slice

  1. 其不是数组或数组指针
  2. 它通过内部指针或相关属性引用数组片段,来实现变长方案
  3. 其本身为引用类型。但自身是结构体,值拷贝传递
  4. 属性len表示可用元素数量,读写操作不能超过此限制
  5. 属性cap表示最大扩张容量,不能超过数组限制
  6. 如果 slice == nil ,则 len 、cap都为 0
推荐
  1. 读写操作实际目标是底层数组
  2. 通过初始化表达式构造,可使用索引号
  3. 使用make创建,指定len与 cap;当省略cap时,len = cap
  4. make动态创建的Slice,省去了数组的长度常量,但可以通过指针访问底层数组

reslice - 切片操作

  1. 基于已有的slice创建新的slice,即在cap的范围内操作数据
  2. 新旧对象都会指向底层数组

append

  1. 向slice尾部添加数据,并返回新的slice
  2. 如果超过了slice.cap的值,则会重新分配底层数组,即使原数组并未填满
  3. 大批量的添加数据时,应该避免使用append,因为频繁创建slice对象会影响性能。可一次性分配len足够大的slice,直接使用索引号操作
  4. 要及时释放不在使用的slice对象,避免持有过期的slice,导致GC无法回收

copy

  1. 在两个Slice之间进行,长度以len小的为准
  2. 两个slice指向同一底层数组,允许元素区间重叠
  3. 应该及时将所需要的数据copy到较小的Slice,以便释放大的底层数组内存