需要删除切片中指定的元素,百度了一下,很多人介绍的方法如下:
import (
"fmt"
"math/rand"
)
func test_slice() {
vect := make([]int, 10)
//1. 赋初值
for i, _ := range vect {
vect[i] = i
}
for i := 0; i < 3; i++ {
k := rand.Intn(10)
vect[k] = -1 //将其中三个值设为-1
}
//vect[9] = -1 //***注:将最后一个元素置为-1
fmt.Println("before:", vect)
//2.遍历切片,并删除值为-1的元素
for _, v := range vect {
if v == -1 {
vect = append(vect[:i], vect[i+1:]...)
}
}
fmt.Println("after:", vect)
}
结果:如果没有vect[9] = -1
,这段程序是OK的(假设随机生成的-1恰好不是最后一个),但加上这句话,编译时就会报错:panic: runtime error: slice bounds out of range
还不知道什么原因?有人说是循环中删除自身导致长度变化引起越界,但为什么最后一个元素不是要删除的就没有问题呢?希望知道的同学能分享一下,谢谢啦!
最后的解决方案是新定义了一个slice
func test_slice() {
vect := make([]int, 10)
for i, _ := range vect {
vect[i] = i
}
for i := 0; i < 3; i++ {
k := rand.Intn(10)
vect[k] = -1
}
vect[9] = -1
fmt.Println("before:", vect)
var vt = make([]int, 0)
for _, v := range vect {
if v != -1 {
vt = append(vt, v)
}
}
vect = vt
fmt.Println("after:", vect, vt)
}