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
底层数组中的先前值。
一个快速的解决方案是复制currentPath
into的内容,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 关注
- 121 浏览
添加回答
举报