Go 中追加的奇怪行为
我正在尝试使用 Go 解决 LeetCode 上的子集问题。我想出了以下解决方案:
func subsets(nums []int) [][]int {
sol := make([][]int,0)
temp:= make([]int,0)
var backtrack func(idx int)
backtrack = func(idx int) {
sol = append(sol, temp)
fmt.Println(temp, append([]int{},temp...))
if idx == len(nums) {
return
}
for i:= idx; i
但是,这个解决方案是不正确的。我注意到我需要使用append(sol,append([]int{},temp...))而不是仅仅sol=append(sol,temp)。
即使 fmt.Println(temp,append([]int{}, temp...)) 语句为 temp 和append([]int{}, temp...) 生成相同的输出,使用append([]int{}, temp...) 的更正版本实际上有效。有人可以解释在这种情况下 temp 和 append([]int{}, temp...) 之间的区别吗?为什么修正后的版本可以工作,而初始版本却不能?
预计 temp
和 append([]int{},temp...)
相同
正确答案
sol =append(sol, temp)
的问题是您将切片 temp
添加到 sol
中,而不是切片“内部”的项目。正如 Slice 内部博客文章 中所述,切片“只是”指向数组的指针、长度和容量。
因此,在您的情况下,由于 temp
在每次迭代中重用,因此 temp
切片下的数组内容将被覆盖,并且您之前添加到 sol
的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println
语句显示在附加之前, temp
具有正确的值。
当 append([]int{}, temp...)
创建一个新切片时,新切片内的值不可能发生变化,因为它没有被重用。
以上就是Go 中追加的奇怪行为的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
Go 中追加的奇怪行为
下载Word文档到电脑,方便收藏和打印~