面试题答案
一键面试- Go语言切片的底层结构
- 指针:指向底层数组的第一个元素。
- 长度(len):表示切片当前的元素个数。
- 容量(cap):表示切片当前可容纳的最大元素个数,从切片的起始元素到其底层数组的最后一个元素的个数。
- 对切片扩容机制实现和性能的影响
- 扩容机制实现:当向切片中添加元素,使得
len
超过cap
时,就会触发扩容。扩容时,Go会重新分配内存,创建一个新的底层数组,新数组的容量通常是原容量的2倍(如果原容量小于1024),如果原容量大于等于1024,则新容量会增加原容量的1/4。然后将原切片的内容复制到新的底层数组对应的位置上。 - 性能影响:由于扩容涉及内存的重新分配和数据的复制,所以频繁的扩容会导致性能下降。因为内存重新分配涉及系统调用,而数据复制需要消耗CPU时间。
- 扩容机制实现:当向切片中添加元素,使得
- 举例说明
package main
import (
"fmt"
)
func main() {
s := make([]int, 0, 5)
for i := 0; i < 10; i++ {
s = append(s, i)
fmt.Printf("Length: %d, Capacity: %d\n", len(s), cap(s))
}
}
在这个例子中,开始创建了一个容量为5的切片 s
。当添加元素时,前5次添加不会触发扩容,因为len
没有超过cap
。当添加第6个元素时,len
变为6,超过了cap
(5),触发扩容。新的容量变为10(原容量5的2倍,因为原容量小于1024),然后将原切片中的5个元素复制到新的底层数组。这样在循环添加元素过程中,可以清晰看到每次添加元素时len
和cap
的变化,体现了扩容机制对切片的影响。