如何重复从切片中删除项目?

时间:2021-07-11 14:07:39

标签: go slice

我想从一个数组创建多个切片。每片一片,缺少一个元素。我正在使用此代码 (playground):

nums := []int{1,2,3}
for i := 0; i < len(nums); i++ {
    fmt.Println(append(nums[:i], nums[i+1:]...))
}

我期待收到

[2 3]
[1 3]
[1 2]

但我收到了

[2 3]
[2 3]
[2 3]

这是为什么?

2 个答案:

答案 0 :(得分:1)

非常感谢您向我指出这一点。这是我目前的解决方案。它只是复制我正在处理的数组 (playground)

package main

import (
    "fmt"
)

func main() {
    nums := []int{1,2,3}
        for i := 0; i < len(nums); i++ {
            cpy := make([]int, len(nums))
            copy(cpy, nums)
            fmt.Println(append(cpy[:i], cpy[i+1:]...))
        }
}

答案 1 :(得分:1)

As mkopriva correctly pointed out,您的程序的输出与您预期的不同,因为 append 产生的所有切片共享相同的底层数组。您需要以某种方式将这些切片与切片 nums 的底层数组分离。

一种可行的方法确实是使用 copy,就像您在 your answer 中所做的那样。还有一个更简洁的替代方案,尽管对于未经训练的眼睛来说可能不会更清晰。

您可以使用 copyfull-slice expression,又名 三索引切片)作为 {{1} 的第一个参数,而不是使用 nums[:i:i] }}:

append

生成的切片将与切片 nums := []int{1,2,3} for i := 0; i < len(nums); i++ { fmt.Println(append(nums[:i:i], nums[i+1:]...)) } 的底层数组分离,您将获得所需的输出:

nums

(Playground)