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)
}
当我们真正查看Go标准库的源代码时,我们可以看到其中
goto
s其实应用的很好。例如,在
math/gamma.go
文件中, 使用了goto
语句:goto
在这种情况下使我们免于引入另一个仅用于控制流的(布尔)变量,最后检查。 _在这种情况下_,goto
语句实际上使代码更易读且更容易遵循(与你提到的反对goto
的论点完全相反)。另请注意,
goto
语句有一个非常具体的用例。 goto 上的语言规范 声明它可能不会跳过进入范围(被声明)的变量,并且它可能不会跳入其他(代码)块。