为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
BIG阳 2022-01-10 18:45:49
抱歉,如果这看起来很基本,但为什么会出现此错误?我没有看到任何超出范围的切片/数组。package mainimport "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 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

[...]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 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]

这(游乐场)实际上会反转切片:


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]


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信