MST

星途 面试题库

面试题:Go语言中切片扩容机制对性能的影响及优化

已知Go语言切片在容量不足时会进行扩容,请详细描述切片的扩容算法。在实际开发中,如何预先估计切片容量以避免频繁扩容,进而提升性能?请举例说明。
23.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

切片扩容算法

  1. 扩容条件:当向切片中添加元素,而当前切片的容量不足以容纳新元素时,就会触发扩容。
  2. 扩容策略
    • 如果当前切片的容量小于1024,那么新的容量会变为原来容量的2倍。
    • 如果当前切片的容量大于或等于1024,那么新的容量会变为原来容量的1.25倍。
    • 扩容时,Go语言会创建一个新的底层数组,其大小为新的容量,然后将原切片中的元素复制到新的数组中。

预先估计切片容量提升性能

  1. 方法:在创建切片时,通过make函数的第三个参数来预先指定切片的容量。这样可以避免在添加元素过程中频繁的扩容操作,因为已经提前分配好了足够的空间。
  2. 示例
package main

import (
    "fmt"
)

func main() {
    // 预先估计容量为100
    var s = make([]int, 0, 100)
    for i := 0; i < 100; i++ {
        s = append(s, i)
    }
    fmt.Println(s)
}

在这个示例中,make([]int, 0, 100)创建了一个初始长度为0,容量为100的切片。后续通过append向切片中添加100个元素时,由于预先分配了足够的容量,不会触发扩容操作,从而提升了性能。