【问题标题】:getting "slice bounds out of range" error on iterating over a slice and modifying it via "append()"遍历切片并通过“append()”修改它时出现“切片超出范围”错误
【发布时间】:2023-03-15 03:23:02
【问题描述】:

我编写了一个函数,用字符串切片([]string)中的一个单词替换重复的单词序列。我使用“range”循环切片并使用“append()”修改切片。下面是代码:

func RemoveContinuosStrings(input []string) []string {  
        top:=0

        for i,_ := range input {
                if input[i] != input[top] {
                        if top != i-1 {
                                input = append(input[:top+1], input[i:]...)
                        }   
                        top = i 
                }   
        }   
        return input[:top+1]
}

func main() {

        scanner := bufio.NewScanner(os.Stdin)
        fmt.Println("enter text")
        input := make([]string, 0, 0)

        for scanner.Scan() {
                input = append(input, scanner.Text())
        }   

        fmt.Println("INPUT", input)
        input = RemoveContinuosStrings(input)
        fmt.Println("OUTPUT", input)
}

在执行上述代码时,我看到以下错误:

===================================================  
    vignesh@vignesh-ThinkPad-E470 ~/go-book/chapter4 $ ./4_6_eliminate_duplicate_string  
    enter text
    qwe
    asd
    asd
    zxc
    asd
    asd
    INPUT [qwe asd asd zxc asd asd]
    panic: runtime error: index out of range

    goroutine 1 [running]:
    main.RemoveContinuosStrings(0xc420088000, 0x6, 0x8, 0x20, 0x0, 0x0)
        /home/vignesh/go-book/chapter4/4_6_eliminate_duplicate_string.go:11 +0x2a0
    main.main()
        /home/vignesh/go-book/chapter4/4_6_eliminate_duplicate_string.go:33 +0x33a
    vignesh@vignesh-ThinkPad-E470 ~/go-book/chapter4 $ 
=======================================================

所以,通过“范围”将其附加到正在迭代的切片上是不是错误或不允许。我在网上看到了几个例子,它们确实附加到了切片上,但是在不使用“范围”的情况下进行了迭代(例如:for i=0; i

【问题讨论】:

    标签: go slice


    【解决方案1】:

    在循环中更改数组大小时,请记住使用简单的 for 而不是 for range

    func RemoveContinuosStrings(input []string) []string {
        top:=0
    
        for i:=0;i<len(input);i++ {
            if input[i] != input[top] {
                if top != i-1 {
                    input = append(input[:top+1], input[i:]...)
                    i=top+1
                    top=top+1
                }else{
                    top = i
                }
            }
        }
        return input[:top+1]
    }
    

    【讨论】:

    • 那么,在使用“range”时改变循环内的数组大小是不是错了??
    • Go 在 range 子句中使用值的副本而不是值本身。因此,当我们获取值的指针时,我们实际上是在获取值的副本的指针。此副本在整个范围子句中重复使用。但是,当您更改数组大小时,原始数据会更改,但注意范围子句正在使用的副本会发生
    • 感谢您的评论和代码 sn-p 帮助我。在这里发布问题之前,我在网上看了很多,以了解“范围”的任何此类条件,但找不到任何帮助。那么,您能否告诉我您是从哪里或如何知道答案的??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2015-11-21
    • 2019-11-05
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多