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
相关产品推荐
相关产品推荐

