1 回答
TA贡献1841条经验 获得超3个赞
Go 中的切片是包含指向底层数组的指针、长度和容量的小描述符。有关更多详细信息,请参阅切片内部。
将切片传递给函数时,会复制描述符,但不会复制底层数组。这意味着currentPath它将始终指向相同的底层数组,但通过递归将具有不同的值:
在节点
11:currentPath = [5 4 11]在节点
2:currentPath = [5 4 11 2]。添加到paths长度 4。备份到节点
11:currentPath = [5 4 11]在节点
7:currentPath = [5 4 2 7]。
在 node7中,底层数组仍然是相同的,并且与存储在paths. 但是节点 7 现在附加7到长度为 3 的切片上,覆盖了2底层数组中的先前值。
一个快速的解决方案是复制currentPathinto的内容,path而不是直接存储切片:
if root.Left == nil && root.Right == nil && root.Val == sum {
newSlice := make([]int, len(currentPath))
copy(newSlice, currentPath)
*paths = append(*paths, newSlice)
fmt.Println("paths updated ", *paths)
return
}
重要说明:当切片需要增长时,会复制底层数组,从而产生一个单独的数组。在示例中,切片在节点处增长到 4 的容量,因此它在节点和4处保持相同的底层数组。如果它在 node 增长,添加到的切片不会与任何人共享其底层数组。272path
- 1 回答
- 0 关注
- 202 浏览
添加回答
举报
