面试题答案
一键面试优化策略
- 预分配内存:在初始化切片时,根据预估的最大元素数量使用
make
函数预分配足够的内存,减少动态扩容的次数。 - 批量操作:将多次小的切片操作合并为一次或几次大的操作,减少扩容触发频率。
从底层结构和扩容机制优化
Go语言切片底层是一个数组指针、长度和容量的结构体。扩容机制是当元素数量超过容量时,新容量一般为原容量的2倍(如果原容量小于1024),大于1024时,新容量为原容量的1.25倍。
- 调整扩容倍数:如果对性能要求极高,可以自定义扩容逻辑,比如根据业务场景调整扩容倍数,减少不必要的内存分配。
- 内存复用:在某些场景下,可以尝试复用已有的切片内存,避免频繁创建新的底层数组。
代码示例
- 预分配内存示例
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)
}
- 批量操作示例
package main
import (
"fmt"
)
func main() {
var data []int
var batch []int
for i := 0; i < 10; i++ {
batch = append(batch, i)
if len(batch) == 5 {
data = append(data, batch...)
batch = batch[:0]
}
}
if len(batch) > 0 {
data = append(data, batch...)
}
fmt.Println(data)
}