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.