为什么Go有一个“goto”声明

时间:2012-06-16 15:58:41

标签: go goto

Google的Go语言是一种新语言。因此我惊讶地发现它有一个'goto'声明。我一直被教导说'goto'语句已成为过去,而且它会使程序的实际流程陷入窘境。功能(或方法,如果你愿意)总是一种更好的控制流程的方法。

我一定错过了什么。为什么以及何时使用'goto'是一个好主意?或者谷歌为什么要加入它?

3 个答案:

答案 0 :(得分:65)

当我们实际检查Gos源代码(标准库)时,我们可以看到goto实际应用的位置。

例如,在math/gamma.go文件中,the goto statement is used

  for x < 0 {
    if x > -1e-09 {
      goto small
    }
    z = z / x
    x = x + 1
  }
  for x < 2 {
    if x < 1e-09 {
      goto small
    }
    z = z / x
    x = x + 1
  }

  if x == 2 {
    return z
  }

  x = x - 2
  p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6]
  q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7]
  return z * p / q

small:
  if x == 0 {
    return Inf(1)
  }
  return z / ((1 + Euler*x) * x)
}

在这种情况下,goto使我们不会引入另一个(布尔)变量,该变量仅用于控制流,最后检查。 在这种情况下goto语句使代码实际上更好地阅读并更容易理解(完全与你提到的goto的论据相反)。

另请注意,goto语句具有非常具体的用例。 language specification on goto表示它可能不会跳过进入作用域的变量(被声明),并且它可能不会跳转到其他(代码)块。

答案 1 :(得分:22)

当没有任何内置控件功能完全符合您的要求时,当您可以用goto表达您想要的内容时,Goto是一个好主意。 (在没有goto的情况下,在某些语言的情况下这是很遗憾。你最终滥用某些控制功能,使用布尔标志,或使用比goto更差的其他解决方案。)

如果某些其他控件功能(以相当明显的方式使用)可以执行您想要的操作,则应优先使用它来转到goto。如果没有,请加粗并使用转到!

最后值得注意的是Go的goto有一些限制,旨在避免一些模糊的错误。请参阅the spec.

中的这些限制

答案 2 :(得分:3)

自从60年代和70年代Spaghetti code时代以来,Goto语句已经获得了很多信誉。那时候软件开发方法很糟糕。然而,Goto本身并不是邪恶的,但当然可以被懒惰或不熟练的程序员滥用和滥用。滥用Gotos的许多问题都可以通过团队代码审查等开发流程来解决。

goto以与continuebreakreturn相同的技术方式进行跳转。有人可能会说这些陈述是以同样的方式是邪恶的,但事实并非如此。

为什么Go团队包含Gotos可能是因为它是一个常见的流控制原语。此外,他们希望得出结论,围棋的范围不包括制作一种不容易滥用的愚蠢安全语言。