面试题答案
一键面试容量(capacity)字段的作用
- 内存预分配:容量代表切片在当前底层数组中,从切片的第一个元素开始,最多能容纳的元素数量。它用于内存的预分配,这样在向切片追加元素时,如果元素数量没有超过容量,就不需要频繁地重新分配内存,从而提高性能。例如,初始化一个切片
s := make([]int, 0, 10)
,这里的10
就是容量,即使当前切片s
中没有任何元素,但底层已经分配了能容纳10个int
类型元素的内存空间。 - 防止数据越界:它为切片操作提供了一个边界检查依据。当我们在切片上进行操作(如追加元素)时,需要根据容量来判断是否会超出底层数组的范围,从而避免越界错误。
当切片的元素数量超过当前容量时发生的情况
- 内存重新分配:Go语言会自动为切片重新分配内存。新分配的内存大小一般是原容量的两倍(如果原容量小于1024)。如果原容量大于或等于1024,新容量会增加原容量的1/4。例如,原切片容量为5,当追加元素使其元素数量超过5时,新的容量可能变为10(2倍);若原容量为2048,新容量可能变为2560(增加1/4)。
- 数据复制:重新分配内存后,Go会将原切片中的所有元素复制到新的内存空间中,然后再将新的元素追加到新的切片中。这一过程涉及到内存的重新分配和数据的复制,所以相对开销较大。因此,在初始化切片时,如果能大致预估元素数量,合理设置容量可以减少内存重新分配的次数,提高程序效率。