- 切片容量增长规则:
- 当Go切片的容量不足以容纳新元素时,会重新分配内存,创建一个更大的底层数组。
- 如果当前切片的容量小于1024,新的容量会变为原来的2倍。
- 如果当前切片的容量大于或等于1024,新的容量会变为原来的1.25倍。
- 代码展示:
package main
import (
"fmt"
)
func main() {
s := make([]int, 5, 10)
for i := 0; ; i++ {
capBefore := cap(s)
s = append(s, i)
capAfter := cap(s)
if capAfter != capBefore {
fmt.Printf("After appending element %d, capacity changed from %d to %d\n", i, capBefore, capAfter)
}
if cap(s) > 1000 {
break
}
}
}
- 实际开发中优化内存使用:
- 在初始化切片时,尽量根据实际需要预分配足够的容量,避免频繁的内存重新分配。例如,如果已知需要存储1000个元素,可以直接
make([]int, 0, 1000)
,这样在添加元素时不会因为容量不足而频繁重新分配内存,提高性能并减少内存碎片。
- 当确定不再向切片添加元素时,可以使用
copy
函数和make
函数将切片复制到一个新的具有合适容量的切片中,从而释放不必要的内存。例如:
s := make([]int, 1000, 2000)
// 填充s
s = append(s, 1, 2, 3)
newS := make([]int, len(s))
copy(newS, s)
s = newS
- 这样新的切片
newS
容量和长度一致,释放了原切片make([]int, 1000, 2000)
多余的容量所占用的内存。