goto et labels
do
goto continuer
print("sauté")
::continuer::
print("ici")
end
Un label se déclare avec ::nom:: et goto nom y transfère l'exécution. Le saut peut être
en avant (label pas encore rencontré au moment du goto) ou en arrière.
Visibilité
Un label doit être visible depuis le goto qui le cible : il doit se trouver dans le même bloc,
ou dans un bloc englobant du goto (jamais dans un bloc plus imbriqué, ni dans un bloc frère).
Un goto vers un label inexistant ou non visible est une erreur de compilation
(« Aucun label '...' n'est visible pour <goto> à la ligne ... »).
Deux labels du même nom ne peuvent pas coexister dans la portée d'une même fonction sans que l'un masque proprement l'autre à un niveau de bloc plus profond ; redéclarer un label déjà résolu au même niveau est une erreur (« Label '...' déjà défini à la ligne ... »).
Cas d'usage typique
goto est surtout utile pour sortir de boucles imbriquées (au-delà de ce que permet un simple
break) ou pour simuler un continue multi-niveaux :
for i = 1, 3 do
for j = 1, 3 do
if i == j then goto suite end
print(i, j)
end
::suite::
end
break et continue (voir Structures de contrôle) couvrent la grande
majorité des besoins de saut habituels ; réservez goto aux cas qu'ils ne couvrent pas.