我正在遍历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
- 感谢您的答复-现在有更好的理解。
我个人更喜欢创建一个副本。 但是,如果不更改
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) } } |