如果我们有这样的一个切片
list := []int{0,1,2,3,4,5,6,7,8,9,10}
出于某种原因我们要根据下标对这个切片进行过滤,而不是根据值进行过滤,过滤规则为偶数位去掉基数位保留,那么我们写出了这样的代码
for i,_ := range list{
if i%2==0{
list = append(list[:i],list[i+1:]... )
}
}
当我们觉得自己成功的时候,现实给了我们沉重的打击
panic: runtime error: slice bounds out of range [9:7]
goroutine 1 [running]:
main.main()
E:/gopath/src/dataStructure/arrayList.go:26 +0x20a
代码无情的报错了,我们来分析下原因,报错说是切片超出范围,明明我有是个元素的,为什么超出范围了呢,我们仔细观察下我们的代码,通过debug得知
for i,_ := range list{
if i%2==0{
//这里每执行一次,list的元素就少了一个
list = append(list[:i],list[i+1:]... )
fmt.Println(i,"---",list)
}
}
我们看一下打印的结果
0 --- [1 2 3 4 5 6 7 8 9 10] //当i==0的时候确实删除了我们希望删除的元素,此时list为[1 2 3 4 5 6 7 8 9 10]
2 --- [1 2 4 5 6 7 8 9 10] //当i==2的时候此时list[2]=3,固把3删除,此时list为 [1 2 4 5 6 7 8 9 10] 到这里我们就发现这不是我们想要的结果
4 --- [1 2 4 5 7 8 9 10]
6 --- [1 2 4 5 7 8 10]
panic: runtime error: slice bounds out of range [9:7]
goroutine 1 [running]:
main.main()
E:/gopath/src/dataStructure/arrayList.go:26 +0x2f7
那么怎么可以根据下标删除切片的元素呢
list := []int{0,1,2,3,4,5,6,7,8,9,10}
//我们可以倒叙遍历,然后在删除,这样每次都是在list的最后面把我们希望
//的数据删除了,不影响list本身
for i:=len(list)-1;i>=0;i--{
if i%2 == 0{
list = append(list[:i],list[i+1:]... )
}
}
fmt.Println(list)
查看打印结果正确
C:\Users\v_licguo\AppData\Local\Temp\___go_build_dataStructure__1_.exe #gosetup
[1 3 5 7 9]