MST

星途 面试题库

面试题:Go语言切片定义及容量变化

请阐述Go语言中切片的定义方式,并举例说明在向切片中添加元素时,其容量是如何变化的,以及相关原理。
44.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

切片定义方式

  1. 使用字面量定义
s := []int{1, 2, 3}

这种方式直接初始化一个包含特定元素的切片。

  1. 使用 make 函数定义
s := make([]int, 5, 10)

这里 make 函数创建了一个类型为 int 的切片,长度为 5,容量为 10。第一个参数是切片类型,第二个参数是长度,第三个参数(可选)是容量。

  1. 从数组创建切片
a := [5]int{1, 2, 3, 4, 5}
s := a[1:3]

通过从数组 a 中切取部分元素创建切片 s,从索引 1 开始(包含)到索引 3 结束(不包含)。

向切片添加元素时容量变化及原理

  1. 容量足够时 假设我们有一个切片 s,初始容量为 10,长度为 5
s := make([]int, 5, 10)
s = append(s, 6)

此时,由于切片的容量大于长度,即还有剩余空间,append 操作会直接将新元素添加到切片末尾,长度增加 1,容量不变。

  1. 容量不足时 当切片的容量已经被占满,再进行 append 操作时:
s := make([]int, 10, 10)
for i := 0; i < 5; i++ {
    s = append(s, i)
}

此时容量为 10,长度也为 10,当再次执行 append 时,Go 运行时会重新分配内存,新的容量通常是原容量的 2 倍(如果原容量小于 1024)。如果原容量大于或等于 1024,则新容量会增加原容量的 1/4。然后将原切片的内容复制到新的内存地址,再将新元素添加进去。这样做是为了减少内存分配和复制的开销,提高性能。