面试题答案
一键面试切片定义方式
- 使用字面量定义
s := []int{1, 2, 3}
这种方式直接初始化一个包含特定元素的切片。
- 使用
make
函数定义
s := make([]int, 5, 10)
这里 make
函数创建了一个类型为 int
的切片,长度为 5
,容量为 10
。第一个参数是切片类型,第二个参数是长度,第三个参数(可选)是容量。
- 从数组创建切片
a := [5]int{1, 2, 3, 4, 5}
s := a[1:3]
通过从数组 a
中切取部分元素创建切片 s
,从索引 1
开始(包含)到索引 3
结束(不包含)。
向切片添加元素时容量变化及原理
- 容量足够时
假设我们有一个切片
s
,初始容量为10
,长度为5
。
s := make([]int, 5, 10)
s = append(s, 6)
此时,由于切片的容量大于长度,即还有剩余空间,append
操作会直接将新元素添加到切片末尾,长度增加 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。然后将原切片的内容复制到新的内存地址,再将新元素添加进去。这样做是为了减少内存分配和复制的开销,提高性能。