为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
拉莫斯之舞 2022-06-27 10:10:09
我正在编写一个程序来生成一片独特元素的所有可能排列。相同的代码可以在这里找到有一次,我需要从原始数字切片创建一个新切片。这个新切片比原始切片少一个元素。我尝试了两种不同的变体appendnums是原始切片,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 的确切区别是什么?
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

这里 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)]...)


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信