删除切片中的每个元素

Jon*_*han 1 go

当我尝试循环切片并删除序列中的每个元素以打印剩余元素时,我会得到一些意想不到的行为,使用SliceTricks中建议的Delete方法.例如,当我尝试通过包含字母a片环,我希望可以将输出为,,的顺序:[A B C][B C][A C][A B]

方法1

package main

import "fmt"

func main() {
    a := []string {"A", "B", "C"}
    for i, _ := range a {
        fmt.Println(append(a[:i], a[i+1:]...))
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这里的输出对我来说是令人惊讶的.它输出[B C]三次.

通过执行以下操作,我最终得到了我预期的行为:

方法2

package main

import "fmt"

func main() {
    a := []string {"A", "B", "C"}
    for i, _ := range a {
        result := make([]string, 0)
        result = append(result, a[:i]...)
        result = append(result, a[i+1:]...)
        fmt.Println(result)
    }
}
Run Code Online (Sandbox Code Playgroud)

是什么导致了方法1中的意外行为,除了方法2之外还有更好的方法来实现吗?

jim*_*imt 5

如果您想在没有额外分配的情况下执行此操作,请尝试仅交换值,如下例所示:

请注意,这假设您可以随机播放列表内容.如果没有,只需在循环之前复制一次列表,并执行与下面相同的操作.

package main

import "fmt"

func main() {
    set := []string{"a", "b", "c"}
    for i := range set {
        set[0], set[i] = set[i], set[0]
        fmt.Println(set[1:])
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

[b c]
[a c]
[a b]
Run Code Online (Sandbox Code Playgroud)