错误发生在Go-lang中事件的逻辑顺序上

时间:2018-07-05 23:14:18

标签: go

我在运行中遇到了一个莫名其妙的错误,该行在理论上不应在那一刻执行。

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”的输出)。这有些令人困惑,我无法确切查明此错误的原因。为什么会这样?

1 个答案:

答案 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循环从0composition[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