MST

星途 面试题库

面试题:Go切片的容量变化及内存优化

有一个Go切片s,初始使用make函数创建,容量为10,长度为5。假设不断向该切片添加元素,直至其容量发生变化。请说明在这个过程中,切片的容量是如何增长的?并编写代码展示这个过程,同时解释如何在实际开发中利用切片容量的特性来优化内存使用。
17.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 切片容量增长规则
    • 当Go切片的容量不足以容纳新元素时,会重新分配内存,创建一个更大的底层数组。
    • 如果当前切片的容量小于1024,新的容量会变为原来的2倍。
    • 如果当前切片的容量大于或等于1024,新的容量会变为原来的1.25倍。
  2. 代码展示
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
        }
    }
}
  1. 实际开发中优化内存使用
    • 在初始化切片时,尽量根据实际需要预分配足够的容量,避免频繁的内存重新分配。例如,如果已知需要存储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)多余的容量所占用的内存。