Go微服务实战
上QQ阅读APP看书,第一时间看更新

3.2.5 其他

切片和数组一样都可以是多维的,本书只介绍Go语言里面的重点,多维部分就略过了。

数组可以为空,也就是有0个元素。切片也可以为空,长度可以为0,但容量不为0,也可以两者都为0。此处需要注意,长度和容量都为0的切片并不等于nil,不能用是否等于nil进行判断,而是要根据长度和容量进行判断。

因为slice是通过指向的底层数组来存储数据的,而且可能有多个slice指向同一个底层数组。这样就会导致一个情况,如果一个小的切片指向这个底层数组,将会导致底层数组处于使用状态而无法被垃圾回收。

也有一种比较极端的情况,可能我们只使用了底层数组的一个元素,而导致底层数组的所有内容不能被回收。在这种情况下,虽然不会报错,但是会占用太多内存,可能导致运行速度变慢。

比如前面的例子:


a := []int{1,2,3,4,5}
a = append(a[:0],a[:3]...)

若删除了后面的两个元素,切片的容量不会变,垃圾回收机制也不会回收后面已删除的两个元素,若想让切片的容量相应减少,有一种方式就是在删除之前,先把a[3]和a[4]赋值为nil。

建议仅在切片声明周期较长、底层数组较大的情况下使用这种处理方式,因为这种方式本身也是有系统开销的。在生命周期比较短或者底层数组不长的情况下,不应考虑这种方式。