MST

星途 面试题库

面试题:Go中切片(slice)底层是如何实现的

请详细阐述Go语言中切片(slice)底层数据结构的组成部分,以及切片在扩容时的具体机制。
30.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

切片底层数据结构组成部分

  1. 指针:指向一个数组,这个数组是切片实际存储数据的地方。通过指针,切片可以访问数组中的元素。
  2. 长度(len):表示切片当前包含的元素个数。这是切片可见的元素数量,通过 len() 函数可以获取。
  3. 容量(cap):从切片的起始元素开始到其底层数组末尾的元素个数。容量决定了切片在不重新分配内存的情况下最多能容纳多少元素,通过 cap() 函数获取。

切片扩容机制

  1. 扩容触发条件:当向切片中添加元素时,如果当前切片的容量不足以容纳新元素,就会触发扩容。例如使用 append() 函数向切片添加元素时可能会发生。
  2. 扩容策略
    • 如果新的大小(原长度 + 新增元素个数)小于等于当前容量的两倍,并且原切片容量小于 1024 ,则新容量变为当前容量的两倍。
    • 如果原切片容量大于等于 1024 ,则新容量变为原容量加上原容量的 1/4 。
    • 如果新的大小大于当前容量的两倍,则新容量直接设置为新的大小。
  3. 内存分配与数据迁移:扩容时,Go 运行时会分配一块新的内存空间,其大小为新计算出的容量。然后将原切片中的数据复制到新的内存空间中,最后返回一个新的切片,该切片指向新分配的内存,长度为原长度加上新增元素个数,容量为新计算出的容量。原切片及其底层数组在没有其他引用的情况下,会被垃圾回收器回收。