我正在研究学术问题和恐慌。 该代码将找到字符串的中间字符。
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
答案 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]