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

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


有一次,我需要从原始数字切片创建一个新切片。这个新切片比原始切片少一个元素。我尝试了两种不同的变体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 的行为不正确。我想了解这两个 Variant 的确切区别是什么?


拉莫斯之舞
浏览 134回答 1
1回答

慕仙森

这里 slicenums[:i]是通过对更大的数组进行切片来创建的nums。这导致它有足够的容量来扩展到位。因此,类似的操作 append(nums[:i], nums[i+1:]...)会导致元素nums被来自的元素覆盖nums[i+1:]。这会改变原始数组,从而改变行为。正如@icza 所建议的,该概念已被捕获here。要修复 Variant 2,我们可以使用这样的完整切片表达式remaining := append(nums[0:i:i], nums[i+1:len(nums):len(nums)]...)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go