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