Go面试题更新 2026-08-05

在 Go 中,若在 for 循环体内对切片执行 append 操作,请说明会观察到什么现象?

编码实现技术原理Go

考察说明

考查对 Go 切片在循环中动态增长机制的理解。

回答思路

  1. 【回答框架 1】遍历切片时,for range 使用副本迭代,循环变量 val 是当前元素的拷贝,修改它不影响原切片。但循环表达式 range 后的切片在循环开始前求值一次,因此循环次数由原始长度决定,新增元素不会遍历到。
  2. 【回答框架 2】若在循环内 append,需区分两种方式:直接 append 到原切片变量,可能触发扩容,产生新底层数组,但循环迭代仍基于旧切片,新增元素不会影响循环次数;若 append 到已声明的另一个切片变量,则不影响原切片。
  3. 【回答框架 3】若在循环内对切片元素进行 append(如对切片切片),需要明确修改的是底层数组内容还是切片结构。对底层数组对应索引位置赋值可生效,但对子切片 append 可能重新分配,不影响原切片。
  4. 【回答框架 4】正确遍历动态增长的切片需用索引循环,并在每次迭代重新获取长度;或用循环追加到新切片,结束后再使用新切片。
  5. 【关键点 1】for range 的切片表达式在循环开始前求值一次。
  6. 【关键点 2】循环内 append 触发扩容时,原切片底层数组不变。
  7. 【关键点 3】新增元素不会导致额外循环迭代。
  8. 【易错点 1】误以为 append 会导致循环次数无限增加。
  9. 【易错点 2】忽略 append 可能改变底层数组引用。
  10. 【易错点 3】在循环内同时修改切片可能引发数据不一致。