Cuando realmente verificamos el código fuente de la biblioteca estándar de Go, podemos ver dónde gotoestán realmente bien aplicados los correos electrónicos.
Por ejemplo, en el math/gamma.goarchivo, se usa la gotodeclaración :
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)
}
En gotoeste caso, nos ahorra la introducción de otra variable (booleana) utilizada solo para el flujo de control, verificada al final. En este caso , la gotodeclaración hace que el código sea realmente mejor de leer y más fácil de seguir (muy al contrario del argumento gotoque mencionaste en tu contra ).
También tenga en cuenta que la gotodeclaración tiene un caso de uso muy específico. La especificación del lenguaje en goto establece que no puede saltar sobre las variables que entran en el alcance (siendo declaradas), y no puede saltar a otros bloques (de código).