猿问

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

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


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]

}

谢谢


BIG阳
浏览 208回答 1
1回答

摇曳的蔷薇

[...]int{1,2,3}不是切片。它是一个容量为 3 的数组。参见“ golang-101-hacks: Array ”如果您尝试附加第四个元素......那将超出范围。但是这里s[:] 将其转换为 slice。实际的 ' index out of range' 来自input[len(input)-i]其中,带有i=0,表示input[len(input)]:超出范围。这会更好(操场)(没有超出范围)最后fmt.Println(s)仍然打印原始数组,而不是返回rev()(被忽略)。这将打印“预期”结果(使用追加,因此变异并添加到切片):package mainimport "fmt"func main() {&nbsp; &nbsp; s := [...]int{1, 2, 3}&nbsp; &nbsp; t := rev(s[:])&nbsp; &nbsp; fmt.Println(s)&nbsp; &nbsp; fmt.Println(t)}func rev(input []int) []int {&nbsp; &nbsp; var j int&nbsp; &nbsp; l := len(input) - 1&nbsp; &nbsp; for i := 0; i <= l; i++ {&nbsp; &nbsp; &nbsp; &nbsp; j = input[l-i]&nbsp; &nbsp; &nbsp; &nbsp; input = append(input, j)&nbsp; &nbsp; }&nbsp; &nbsp; return input}结果:[1 2 3][1 2 3 3 2 1]这(游乐场)实际上会反转切片:var j intvar res []intl := len(input) - 1for i := 0; i <= l; i++ {&nbsp; &nbsp; j = input[l-i]&nbsp; &nbsp; res = append(res, j)}return res结果:[1 2 3][3 2 1]
随时随地看视频慕课网APP

相关分类

Go
我要回答