slice 切片删除 panic: runtime error: slice bounds out of range

来源:互联网 发布:爱淘宝 编辑:程序博客网 时间:2024/06/11 10:57

需要删除切片中指定的元素,百度了一下,很多人介绍的方法如下:

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)}
原创粉丝点击