![image.png](https://static.studygolang.com/181014/04b8313bd3fe02e4235a3393e9dea271.png)
如图所示是输出结果
两个画框框的数组第二个位置的数被改变了
`[0, 3, 5, 7] => [0, 3, 5, 9]`
想破头不知道为什么,想得是可能内部地址指向的值被改变导致
但是总感觉没有重合的地方,应该改不到地址
原因是golang是传值的, slice扩容时,指向的数组可能会变更。
index==4时,
search的入参temp我们称为[temp4] 是[0, 3, 5, 7]。
当调用到leftArr := search(nums, index+1, append(temp, nums[index])) 这句话时,
因为 append操作,改变了temp的大小,所以作为一个新值[temp5]传入到第5层, temp5为[0, 3, 5, 7, 9].
所以第5层返回值是[[0, 3, 5, 7, 9]], 在第4层中的leftArr为第5层的返回值。这时候temp5的生命周期结束。第4层接下来的逻辑,所使用的temp是temp4, 所以最后的返回值是[[0, 3, 5, 7, 9],[0, 3, 5, 7]]。
接下来是index==3时,
leftArr = [[0, 3, 5, 7, 9],[0, 3, 5, 7]]
再往下执行算rightArr时,又开始递归index=4, nums中的下标为4的是9, 所以是[0 3 5] 后面加[9]变成[0 3 5 9]
比较绕, 想不通的,debug就清楚了
#6
更多评论
我没有仔细看呢,但是看结果应该是,切片是引用类型。数组才是基础类型。所以如果多个切片用了一个数组作为基础类型。那么基础类型的修改会影响到所有的引用。
#1