【问题标题】:Panic: runtime error: index out of range恐慌:运行时错误:索引超出范围
【发布时间】:2016-05-22 02:11:26
【问题描述】:

很抱歉,这看起来很基本,但为什么会出现此错误?我没有看到任何超出范围的切片/数组。

package main

import "fmt"

func main(){
    s:= [...]int{1,2,3}
    rev(s[:])
    fmt.Println(s)
}

func rev(input []int) []int {
    var j int
    l:=len(input)-1
    for i:=0; i<l;i++ {
        j= input[len(input)-i]
        input=append(input, j)
        i++
    }
    return input[:l]
}

谢谢

【问题讨论】:

    标签: go


    【解决方案1】:

    [...]int{1,2,3} 不是切片。它是一个容量为 3 的数组。
    见“golang-101-hacks: Array

    如果您尝试附加第四个元素...那将超出范围。

    但是在这里s[:]transforms it into a slice

    实际的“index out of range”来自input[len(input)-i],其中i=0表示input[len(input)]:超出范围。

    这会更好(playground)(不会超出范围)

    最后的fmt.Println(s) 仍然是打印原始数组,而不是rev() 的返回(被忽略)。
    这将打印“预期”结果(使用追加,因此变异并添加到切片):

    package main
    
    import "fmt"
    
    func main() {
        s := [...]int{1, 2, 3}
        t := rev(s[:])
        fmt.Println(s)
        fmt.Println(t)
    }
    
    func rev(input []int) []int {
        var j int
        l := len(input) - 1
        for i := 0; i <= l; i++ {
            j = input[l-i]
            input = append(input, j)
        }
        return input
    }
    

    结果:

    [1 2 3]
    [1 2 3 3 2 1]
    

    这 (playground) 实际上会反转切片:

    var j int
    var res []int
    l := len(input) - 1
    for i := 0; i <= l; i++ {
        j = input[l-i]
        res = append(res, j)
    }
    return res
    

    结果:

    [1 2 3]
    [3 2 1]
    

    【讨论】:

    • @LukeMann 不确定,这超出了切片的范围:我已经编辑了答案。
    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2016-12-31
    • 2013-09-03
    相关资源
    最近更新 更多