【问题标题】:creating new slice by appending to existing slice in golang通过附加到 golang 中的现有切片来创建新切片
【发布时间】:2020-12-09 12:46:18
【问题描述】:

我正在编写一个程序来生成一片独特元素的所有可能排列。 可以找到相同的代码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:]...)

虽然该程序在 Variant 1 上运行良好,但在 Variant 2 上运行不正常。 我想了解这两个变体的确切区别是什么?

【问题讨论】:

  • 您正在使用具有相同数组支持的切片,意味着nums 也已修改,请参阅here
  • 我推荐你探索slices-intro
  • 看到这个答案:Concatenate two slices in Go.
  • 你在 nums 中追加,所以“1 2 3”变成了“2 3 3”
  • 不要使用append 来创建一个新的切片,用它来附加到一个切片上。要创建新切片,请使用切片文字或 make()。要将数据从现有切片复制到新切片,请使用copy()

标签: go slice permutation


【解决方案1】:

这里的切片 nums[:i] 是通过切片更大的数组 nums 创建的。这导致它有足够的容量来扩展到位。所以像append(nums[:i], nums[i+1:]...) 这样的操作会导致nums 中的元素被nums[i+1:] 中的元素覆盖。这会改变原始数组,从而改变行为。

正如@icza 所建议的,该概念已被捕获here

要修复 Variant 2,我们可以像这样使用 full slice expression

remaining := append(nums[0:i:i], nums[i+1:len(nums):len(nums)]...)

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 2019-01-02
    • 1970-01-01
    • 2013-12-10
    • 2017-08-11
    • 2016-12-24
    • 2020-08-10
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多