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

恐慌:运行时错误:切片超出范围 [2:1]

恐慌:运行时错误:切片超出范围 [2:1]

Go
沧海一幻觉 2022-04-26 15:35:30
我正在研究一个学术问题并且 Go 恐慌。该代码将找到字符串的中间字符。func findMiddle(s string) string {    len := len(s)    half := len / 2    if len == 0 {        panic("zero")    }    if len%2 == 0 {        fmt.Println("#53:" + s)        str := s[half-1:1] + s[half:1]        fmt.Println("Even: " + str)        return str    } else {        fmt.Println("#58: " + s)        str := s[half:1]        fmt.Println("Odd: " + str)        return str    }}我的调试输出如下所示:#58: 1Odd: 1#58: 2Odd: 2#58: 5Odd: 5#53:13Even: 1#53:89Even: 8#58: 233Odd: #53:1597panic: runtime error: slice bounds out of range [2:1]goroutine 1 [running]:main.findMiddle(0xc00001a200, 0x4, 0xc00001a200, 0x4)        /home/peter/work/src/misc2/prime-recursion-strings/main.go:68 +0x403main.iterate(0x4f8bc0, 0xc00009c008)        /home/peter/work/src/misc2/prime-recursion-strings/main.go:30 +0x92main.main()        /home/peter/work/src/misc2/prime-recursion-strings/main.go:17 +0xa3exit status 2如您所见,代码在发生恐慌之前会运行多次迭代。有什么线索吗?在这里测试代码:https: //play.golang.org/p/_K1DivJST3F
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

[2:1]是无效的切片索引。正确的格式是[low:high],因此第二个数字必须始终大于(或等于)第一个数字。这就是为什么你会感到恐慌。

解决方法是更换:

        str := s[half-1:1] + s[half:1]

和:

        str := s[half-1:half] + s[half:half+1]

Playground,可以进一步简化为:

        str := s[half-1:half+1]

操场


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

添加回答

举报

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