面试题答案
一键面试在Go语言中,slice的扩容机制如下:当向slice中append元素,容量不足时,会重新分配内存,新的容量是原容量的2倍(如果原容量小于1024);若原容量大于等于1024,则新容量会增加原容量的1/4。
以下情况可以提前预估容量以优化性能:
- 已知数据量上限:当你明确知道要处理的数据的最大数量时,可提前为slice分配足够的容量。例如,要读取一个固定行数的文件,并将每行内容存入slice,可预先分配容量。
- 数据量可估算:某些场景下,虽无法精确知道数据量,但能大致估算。如从数据库中读取一批数据,根据以往经验或数据库统计信息估算数据量。
示例代码如下:
package main
import (
"fmt"
)
func main() {
// 提前预估容量为1000
var data []int
data = make([]int, 0, 1000)
for i := 0; i < 1000; i++ {
data = append(data, i)
}
fmt.Println(data)
}
在上述示例中,通过make([]int, 0, 1000)
预先分配了能容纳1000个int
类型元素的容量,这样在后续的append
操作中,只要元素数量不超过1000,就不会发生扩容,从而提升性能。