shenyi
管理员
管理员
  • UID1
  • 粉丝45
  • 关注0
  • 发帖数839
阅读:2236回复:0

Go 1.14或之前的一个循环代码BUG:请大家避免此写法

楼主#
更多 发布于:2020-07-27 15:27


直接上代码:
  以下代码会直接跑崩
func main() {
         nums := []int{1, 2}
         for i, v := range nums {
                j := i + 1   //这个是关键 。增量=1时 会出问题

              if j < 1 {
                        break  //这里不管写return 还是break 都有问题
                }
                println(j,i,v)
        }
}



相关 issue在这
  https://github.com/golang/go/issues/40367
预估问题
    golang的循环代码生成中间代码(SSA)中的OFORUNTIL和func addLocalInductiveFacts时,推导循环遍历时 在 xxx+1<1 这个增量判断上出了问题
 注意:上述代码只有xxx+1 时才会出问题。如果写成:
  j:=i+2  //看这
 if j<1 {
   xxxxx  
 }
这样并不会有问题。


 注意:golang的for 循环 在汇编层面 会使用类似JMP(plan9汇编) 等命令跳回循环体的开始位置来复用代码逻辑
会讲故事的程序员
游客

返回顶部