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

我正在研究一个学术问题并且 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


沧海一幻觉
浏览 154回答 1
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]操场
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go