首页 文章

恐慌:运行时错误:索引超出范围

提问于
浏览
5

对不起,如果这看起来很基本,但为什么我会收到此错误?我没有看到任何切片/阵列超出范围 .

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

谢谢

1 回答

  • 3

    [...]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() 的返回(被忽略) .
    这将打印"expected"结果(使用追加,因此变异并添加到切片):

    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]
    

相关问题