如果我們有這樣的一個切片
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]