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

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

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)
}

你可能感兴趣的:(学习,go学习)