通过附加到 golang 中的现有切片来创建新切片
creating new slice by appending to existing slice in 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:]...)
虽然该程序在变体 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)]...)
我正在编写一个程序来生成一片唯一元素的所有可能排列。 可以找到相同的代码 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:]...)
虽然该程序在变体 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)]...)