You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言使用指针向[][]int切片追加子集时出现值被覆盖问题

问题根因

你遇到的问题是Go语言切片的底层数组共享特性导致的,和指针传参、竞态条件无关。

具体触发逻辑
  • Go的切片属于引用类型,内部存储了指向底层数组的指针、切片长度、切片容量三个属性。你代码中通过a = append(t,x[z])生成切片a时,如果append操作没有触发切片扩容,a会和传入的t共享同一块底层数组。
  • 你直接把a追加到结果集res中,本质上是把指向共享底层数组的引用存了进去。后续其他递归分支修改同一块底层数组的内容时,之前已经存入res的切片内容会被同步修改,就出现了[0,3,5,7]被改成[0,3,5,9]、重复项的问题。
  • 打印语句执行在a刚生成、还未进入后续递归修改底层数组的时机,所以打印的内容是正确的,和最终res的输出不一致。
修复方案

往结果集追加切片时做一次深拷贝,切断和原有底层数组的关联即可,修改代码如下:
将原代码中

*res = append(*res, a)

替换为:

cloneA := make([]int, len(a))
copy(cloneA, a)
*res = append(*res, cloneA)

内容的提问来源于stack exchange,提问作者Krunal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:54:01