Google的Go语言是一种新语言。因此我惊讶地发现它有一个'goto'声明。我一直被教导说'goto'语句已成为过去,而且它会使程序的实际流程陷入窘境。功能(或方法,如果你愿意)总是一种更好的控制流程的方法。
我一定错过了什么。为什么以及何时使用'goto'是一个好主意?或者谷歌为什么要加入它?
答案 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。如果没有,请加粗并使用转到!
最后值得注意的是Go的goto有一些限制,旨在避免一些模糊的错误。请参阅the spec.
中的这些限制答案 2 :(得分:3)
goto
以与continue
,break
和return
相同的技术方式进行跳转。有人可能会说这些陈述是以同样的方式是邪恶的,但事实并非如此。
为什么Go团队包含Gotos可能是因为它是一个常见的流控制原语。此外,他们希望得出结论,围棋的范围不包括制作一种不容易滥用的愚蠢安全语言。