面试题答案
一键面试切片底层数据结构组成部分
- 指针:指向一个数组,这个数组是切片实际存储数据的地方。通过指针,切片可以访问数组中的元素。
- 长度(len):表示切片当前包含的元素个数。这是切片可见的元素数量,通过
len()
函数可以获取。 - 容量(cap):从切片的起始元素开始到其底层数组末尾的元素个数。容量决定了切片在不重新分配内存的情况下最多能容纳多少元素,通过
cap()
函数获取。
切片扩容机制
- 扩容触发条件:当向切片中添加元素时,如果当前切片的容量不足以容纳新元素,就会触发扩容。例如使用
append()
函数向切片添加元素时可能会发生。 - 扩容策略:
- 如果新的大小(原长度 + 新增元素个数)小于等于当前容量的两倍,并且原切片容量小于 1024 ,则新容量变为当前容量的两倍。
- 如果原切片容量大于等于 1024 ,则新容量变为原容量加上原容量的 1/4 。
- 如果新的大小大于当前容量的两倍,则新容量直接设置为新的大小。
- 内存分配与数据迁移:扩容时,Go 运行时会分配一块新的内存空间,其大小为新计算出的容量。然后将原切片中的数据复制到新的内存空间中,最后返回一个新的切片,该切片指向新分配的内存,长度为原长度加上新增元素个数,容量为新计算出的容量。原切片及其底层数组在没有其他引用的情况下,会被垃圾回收器回收。