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

时间:2016-05-22 02:11:26

标签: go

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

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 个答案:

答案 0 :(得分:3)

[...]int{1,2,3}不是切片。这是一个容量阵列3 请参阅&#34; golang-101-hacks: Array&#34;

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

但是s[:] transforms it into a slice

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

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

最终fmt.Println(s)仍然打印原始数组,而不是rev()的返回(被忽略)。
这打印了&#34;期望&#34;结果(使用append,如此变异并添加到切片中):

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]