我很惊讶地发现 Go 有一个“goto”语句。我一直被教导“goto”语句已成为过去,而且是邪恶的,因为它会阻碍程序的实际流程,而且函数或方法总是控制流程的更好方法。
我肯定错过了什么。为什么谷歌包含它?
当我们实际查看 Go 标准库的源代码时,我们可以看到gotos 实际应用得很好的地方。
goto
例如,在math/gamma.go文件中,使用了以下goto语句:
math/gamma.go
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语句有一个非常具体的用例。goto 上的语言规范声明它不能跳过进入作用域(被声明)的变量,也不能跳转到其他(代码)块。