面试题答案
一键面试- 预先分配足够的容量
- 代码示例:
package main import "fmt" func main() { // 假设已知大概的数据量为1000 data := make([]int, 0, 1000) for i := 0; i < 1000; i++ { data = append(data, i) } fmt.Println(data) }
- 理由:Go语言中切片在进行
append
操作时,如果当前容量不足,会重新分配内存,将原切片的数据复制到新的内存地址。这个过程涉及内存分配和数据复制,开销较大。预先分配足够的容量,可以避免在添加元素过程中频繁的扩容操作,减少内存分配和数据复制的次数,从而提高性能。
- 使用
cap
函数来判断是否需要扩容- 代码示例:
package main import "fmt" func main() { data := make([]int, 0, 10) for i := 0; i < 20; i++ { if len(data) == cap(data) { // 手动扩容,这里简单地翻倍 newData := make([]int, len(data), cap(data)*2) copy(newData, data) data = newData } data = append(data, i) } fmt.Println(data) }
- 理由:通过
cap
函数获取当前切片的容量,当len
达到cap
时手动进行扩容,且可以根据实际情况选择合适的扩容策略(如翻倍等)。这样可以有针对性地控制扩容时机,避免在每次append
时由系统默认的扩容机制导致不必要的性能损耗,同时也可以更灵活地根据数据增长特点来优化内存使用。