MST

星途 面试题库

面试题:Go语言切片扩容机制基础

在Go语言中,当切片容量不足需要扩容时,其扩容的大致规则是怎样的?请举例说明不同初始容量下,切片增长后的容量变化。
43.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 扩容大致规则
    • 如果新的容量(所需容量)小于当前容量的2倍,且当前切片的容量小于1024,则新容量会扩展为当前容量的2倍。
    • 如果新的容量大于当前容量的2倍,则新容量会直接设置为新的容量。
    • 如果当前切片的容量大于或等于1024,则新容量会扩展为当前容量的1.25倍,直到新容量大于或等于所需容量。
  2. 举例说明
    • 初始容量小于1024
      package main
      
      import (
          "fmt"
      )
      
      func main() {
          s := make([]int, 0, 5)
          for i := 0; i < 10; i++ {
              s = append(s, i)
          }
          fmt.Printf("初始容量5,增长后容量: %d\n", cap(s))
      }
      
      在这个例子中,初始容量为5,小于1024。当需要容纳10个元素时,所需容量为10,10小于当前容量5的2倍(10),所以新容量扩展为当前容量的2倍,即10。
    • 初始容量大于或等于1024
      package main
      
      import (
          "fmt"
      )
      
      func main() {
          s := make([]int, 0, 1024)
          for i := 0; i < 1500; i++ {
              s = append(s, i)
          }
          fmt.Printf("初始容量1024,增长后容量: %d\n", cap(s))
      }
      
      初始容量为1024,当需要容纳1500个元素时,所需容量为1500。1500大于当前容量1024的2倍不成立,1024的1.25倍为1280(1024 * 1.25),1280小于1500,继续扩展,1280的1.25倍为1600(1280 * 1.25),1600大于1500,所以增长后容量为1600。
    • 新容量大于当前容量2倍
      package main
      
      import (
          "fmt"
      )
      
      func main() {
          s := make([]int, 0, 5)
          for i := 0; i < 20; i++ {
              s = append(s, i)
          }
          fmt.Printf("初始容量5,增长后容量: %d\n", cap(s))
      }
      
      初始容量为5,当需要容纳20个元素时,所需容量为20,20大于当前容量5的2倍(10),所以新容量直接设置为所需容量20。