我正在遍历golang中的一个切片,并逐个挑选元素。 我遇到的问题是,删除项目后,我应该重置索引还是从头开始,但是我不确定如何做。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
   "fmt"
)

func main() {
    x := []int{1, 2, 3, 7, 16, 22, 17, 42}
    fmt.Println("We will start out with", x)

    for i, v := range x {
        fmt.Println("The current value is", v)
        x = append(x[:i], x[i+1:]...)
        fmt.Println("And after it is removed, we get", x)
    }
}

将返回以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
We will start out with [1 2 3 7 16 22 17 42]
The current value is 1
And after it is removed, we get [2 3 7 16 22 17 42]
The current value is 3
And after it is removed, we get [2 7 16 22 17 42]
The current value is 16
And after it is removed, we get [2 7 22 17 42]
The current value is 17
And after it is removed, we get [2 7 22 42]
The current value is 42
panic: runtime error: slice bounds out of range

goroutine 1 [running]:
main.main()
    /tmp/sandbox337422483/main.go:13 +0x460

惯用的方法是什么?
我立即想到i-或i = i-1来自Python。

  • 习惯上是不修改迭代的集合,而是迭代地构建一个新集合。
  • play.golang.org/p/6_91N2LWQA(如果需要),但实际上并不需要重复复制所有切片元素。
  • 或者,您是否只想在每次迭代中弹出第一个元素? play.golang.org/p/WgMpEGpZQV
  • 感谢您的答复-现在有更好的理解。

我个人更喜欢创建一个副本。 但是,如果不更改range部分,也可以完成此操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
   "fmt"
)

func main() {
    x := []int{1, 2, 3, 7, 16, 22, 17, 42}
    fmt.Println("We will start out with", x)

    for i := 0; i < len(x);  {
        fmt.Println("The current value is", x[i])
        x = append(x[:i], x[i+1:]...)
        fmt.Println("And after it is removed, we get", x)
    }
}