面试题答案
一键面试优化思路
- 预先分配足够内存:在创建切片时,提前根据预计的元素数量分配足够的内存,减少动态内存分配次数。这样可以避免在添加元素过程中因切片容量不足而频繁进行内存重新分配和拷贝。
- 复用切片:尽量复用已有的切片,避免每次都创建新的切片。对于临时使用的切片,可以在使用完后重置其长度,以便下次复用。
代码示例
- 预先分配足够内存
package main
import (
"fmt"
)
func main() {
// 预计有100个元素,提前分配内存
var data []int
data = make([]int, 0, 100)
for i := 0; i < 100; i++ {
data = append(data, i)
}
fmt.Println(data)
}
在上述代码中,make([]int, 0, 100)
预先分配了容纳100个 int
类型元素的内存空间,这样在后续的 append
操作中,只要元素数量不超过100,就不会触发重新分配内存。
- 复用切片
package main
import (
"fmt"
)
var reusableSlice []int
func processData(data []int) {
// 复用全局的reusableSlice
reusableSlice = reusableSlice[:0]
for _, num := range data {
if num%2 == 0 {
reusableSlice = append(reusableSlice, num)
}
}
fmt.Println(reusableSlice)
}
func main() {
originalData := []int{1, 2, 3, 4, 5, 6}
processData(originalData)
newData := []int{7, 8, 9, 10}
processData(newData)
}
在这个示例中,定义了一个全局的 reusableSlice
。在 processData
函数中,每次使用前先将其长度重置为0,然后复用该切片来存储处理后的数据。这样避免了每次都创建新的切片,减少了内存分配和垃圾回收的压力。