以下golang代码会报错:
package main
import "fmt"
func main() {
sli :=[]int{1,2,3,4,4}
for idx, val:=range sli{
if val == 4{
sli =append(sli[0:idx],sli[idx+1:]...)
}
}
fmt.Printf("%v\n",sli)
}
panic: runtime error: slice bounds out of range [5:4]
goroutine 1 [running]:
main.main()
/box/main.go:9 +0x273
Exited with error status 2
可以认为,在执行for语句时,idx的迭代值已经确定并缓存起来了,不会因为为sli的变化而变化,所以len(sli)变小后,会发生越界panic
使用for index,index递增
package main
import "fmt"
func main() {
sli :=[]int{4,2,3,4,4}
for idx:=0;idx< len(sli);idx++{
if sli[idx] == 4{
sli =append(sli[0:idx],sli[idx+1:]...)
}
}
fmt.Printf("%v\n",sli)
}
输出:[2 3 4]
因为idx的递增和填补效果,遗漏部分元素,不行
正确的处理方式:index递减
package main
import "fmt"
func main() {
sli :=[]int{4,2,3,4,4}
for idx:=len(sli)-1;idx >=0;idx--{
if sli[idx] == 4{
sli =append(sli[0:idx],sli[idx+1:]...)
}
}
fmt.Printf("%v\n",sli)
}