Lorsque nous vérifions le code source de la bibliothèque standard de Go, nous pouvons voir où goto
sont en fait bien appliquées.
Par exemple, dans le math/gamma.go
fichier, le site goto
La déclaration est utilisée :
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)
}
El goto
dans ce cas, cela nous évite d'introduire une autre variable (booléenne) utilisée uniquement pour le flux de contrôle et vérifiée à la fin. Dans ce cas le goto
rend le code plus lisible et plus facile à suivre (contrairement à l'argument contre les goto
que vous avez mentionné).
Notez également que le goto
a un cas d'utilisation très spécifique. Le site spécification du langage sur goto stipule qu'il ne peut pas sauter par-dessus des variables entrant dans le champ d'application (en cours de déclaration), et qu'il ne peut pas sauter dans d'autres blocs (de code).