通过附加到 golang 中的现有切片来创建新切片

creating new slice by appending to existing slice in golang

我正在编写一个程序来生成一片唯一元素的所有可能排列。 可以找到相同的代码 here

有一次我需要从原始数字切片创建一个新切片。这个新切片比原来的切片少了一个元素。我用 append

尝试了两种不同的变体

nums 是原始切片,remaining 是我要创建的新切片。 i 是一个 int,范围从 0len(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:]...)

虽然该程序在变体 1 上运行良好,但在变体 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)]...)