php中文网

Go 语言 append 函数如何避免修改底层数组?

php中文网

解决 append 函数修改底层数组的问题

当使用 go 语言的 append 函数向切片中添加元素时,如果底层数组容量不足,append 将重新分配一个新的底层数组。这可能会修改原始切片的值,即使您使用的是不同的变量名。

问题剖析

在您提供的算法中,您使用 append 向 res 切片中添加组合。当输入数组较小时,它能正常运行,但当输入数组较大时,会出现问题。这是因为当您添加 [1, 2, 3] 组合时,所创建的底层数组的容量为 4。随后添加 [1, 2, 3, 4] 时,它与 [1, 2, 3] 共享底层数组。当您再次回溯到 [1, 2, 3] 并尝试添加元素 5 时,它直接修改了底层数组,从而也修改了 [1, 2, 3, 4]。

解决方案

为了防止此问题,您需要为新切片强制分配一个新底层数组。可以使用 make 和 copy 函数实现:

next := make([]int, len(pre))
copy(next, pre)
next = append(next, (*nums)[i])

这将创建一个新切片 next,它具有与 pre 相同的元素,并具有新的底层数组。然后,您可以使用 next 添加到 res 切片中,而不会修改原始切片。

以上就是Go 语言 append 函数如何避免修改底层数组?的详细内容,更多请关注php中文网其它相关文章!