我在运行中遇到了一个莫名其妙的错误,该行在理论上不应在那一刻执行。
func exampleFunction() {
//cycleCount starts as 1, layerDif = 4 , composition is an int array with 5 entries
if cycleCount <= layerDif {
fmt.Println("Evaluating if")
fmt.Println("layerDif", layerDif, "cycleCount", cycleCount)
for i := 0; i < composition[cycleCount]; i++ { //this is line 68
//... random code
cycleCount++
fmt.Println("cycle++",cycleCount)
exampleFunction() // this is line 72
}
} else {
fmt.Println("Evaluating else")
//... random code
fmt.Println("Argyle")
for i := 0; i < layerDif -1; i++ {
fmt.Println("Sock", i)
//... random code
}
//... random code
}
}
此代码的输出为:
Evaluating if
layerDif 4 cycleCount 1
cycles 2
Evaluating if
layerDif 4 cycleCount 2
cycles 3
Evaluating if
layerDif 4 cycleCount 3
cycles 4
Evaluating if
layerDif 4 cycleCount 4
cycles 5
Evaluating else
panic: runtime error: index out of range
goroutine 1 [running]:
main.exampleFunction()
/home/name/Go/Predict/src/main/Filename.go:68 +0x5c1
main.exampleFunction()
/home/name/Go/Predict/src/main/Filename.go:72 +0x25e
main.exampleFunction()
/home/name/Go/Predict/src/main/Filename.go:72 +0x25e
main.exampleFunction()
/home/name/Go/Predict/src/main/Filename.go:72 +0x25e
...some other output which doesn't matter
exit status 2
我有点不知所措,因为发生错误的行列为68。但是,在给出此输出之前,它会打印“ Evaluating else”,该输出仅应给出一旦完成第68行的评估(递归函数已停止)。第二个奥秘是为什么永不执行“ Evaluate else”之后的for循环(并且应该在其中打印出一系列带有“ Sock”的输出)。这有些令人困惑,我无法确切查明此错误的原因。为什么会这样?
答案 0 :(得分:0)
我能够使用以下代码复制您的错误:
package main
import "fmt"
var cycleCount int
var layerDif int
var composition [5]int
func main() {
cycleCount = 1
layerDif = 4
composition = [5]int{0, 1, 2, 3, 4}
exampleFunction()
}
func exampleFunction() {
if cycleCount <= layerDif {
fmt.Println("Evaluating if")
fmt.Println("layerDif", layerDif, "cycleCount", cycleCount)
for i := 0; i < composition[cycleCount]; i++ { //this is line 68
cycleCount++
fmt.Println("cycle++", cycleCount)
exampleFunction() // this is line 72
}
} else {
fmt.Println("Evaluating else")
fmt.Println("Argyle")
for i := 0; i < layerDif-1; i++ {
fmt.Println("Sock", i)
}
}
}
输出:
Evaluating if
layerDif 4 cycleCount 1
cycle++ 2
Evaluating if
layerDif 4 cycleCount 2
cycle++ 3
Evaluating if
layerDif 4 cycleCount 3
cycle++ 4
Evaluating if
layerDif 4 cycleCount 4
cycle++ 5
Evaluating else
Argyle
Sock 0
Sock 1
Sock 2
panic: runtime error: index out of range
goroutine 1 [running]:
main.exampleFunction()
/Users/daniel/Desktop/main.go:20 +0x38c
main.exampleFunction()
/Users/daniel/Desktop/main.go:23 +0x21a
main.exampleFunction()
/Users/daniel/Desktop/main.go:23 +0x21a
main.exampleFunction()
/Users/daniel/Desktop/main.go:23 +0x21a
main.main()
/Users/daniel/Desktop/main.go:13 +0x65
exit status 2
此代码(我想也是您的代码)的问题是数组composition
的元素。 第68行中的for
循环从0
到composition[cycleCount]
循环,这意味着:
i = 0
i = composition[CycleCount] == composition[1] == 1
// CycleCount is incremented, so:
i = composition[CycleCount] == composition[2] == 2
// and so on
i = 3
i = 4
i = 5
// at this point, else gets evaluated and you see the results of the respective for loop printed
现在,CycleCount
将再次增加,现在为6
,但是composition
的元素少于6个,您会遇到运行时恐慌。
编辑:我刚刚意识到@matb在他的评论中已经提到了这一点。他还建议(我认为)正确的解决方案,即在您的len(composition)
循环条件下检查for
。