go在range中根据下标删除切片元素报错

如果我们有这样的一个切片

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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章