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

时间:2019-12-26 21:27:49

标签: string 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: 1
Odd: 1
#58: 2
Odd: 2
#58: 5
Odd: 5
#53:13
Even: 1
#53:89
Even: 8
#58: 233
Odd: 
#53:1597
panic: 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 +0x403
main.iterate(0x4f8bc0, 0xc00009c008)
        /home/peter/work/src/misc2/prime-recursion-strings/main.go:30 +0x92
main.main()
        /home/peter/work/src/misc2/prime-recursion-strings/main.go:17 +0xa3
exit status 2



如您所见,代码在恐慌之前先运行多次迭代。

有什么线索吗? 在此处测试代码:https://play.golang.org/p/_K1DivJST3F

1 个答案:

答案 0 :(得分: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]

playground