如何解决通过附加到golang中的现有切片来创建新切片
我正在编写一个程序,以生成一片唯一元素的所有可能排列。 相同的代码可以在here
中找到有一次我需要从原始数字切片中创建一个新切片。这个新切片的元素比原始切片少一个。我用append
nums
是原始切片,而remaining
是我尝试创建的新切片。
i
是int
,范围从0
到len(nums)-1
。
变种1:
remaining := make([]int,0)
remaining = append(remaining,nums[:i]...)
remaining = append(remaining,nums[i+1:]...)
变种2:
remaining := append(nums[:i],nums[i+1:]...)
虽然程序在Variant 1上可以正常运行,但在Variant 2上无法正常运行。 我想了解这两个变体的确切区别是什么?
解决方法
此处切片nums[:i]
是通过切片更大的数组nums
来创建的。这导致它具有足够的容量来扩展就位。因此,类似append(nums[:i],nums[i+1:]...)
的操作会导致nums
中的元素被nums[i+1:]
中的元素覆盖。这会改变原始数组,从而改变其行为。
如@icza所建议,该概念已被捕获here。
要修复版本2,我们可以像这样使用full slice expression
remaining := append(nums[0:i:i],nums[i+1:len(nums):len(nums)]...)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。