Příkaz goto je v mnoha programovacích jazycích jednoduchý příkaz pro nepodmíněný skok na označené místo v kódu. Název pochází z anglických slov go a to — doslova „jdi na“. Prakticky umožňuje okamžitě přenést řízení programu na jiný řádek nebo štítek (label) ve stejném kontextu (funkci/proceduře).
Syntaxe a příklady
Ve většině imperativních jazyků se používá kombinace štítku a samotného příkazu goto. Například v jazyce C:
start: /* nějaký kód */ if (podminka) goto start; V různých jazycích se syntaxe liší, ale princip zůstává stejný — existuje místo (label), na které se přepne provádění.
Podpora v programovacích jazycích
Mnoho jazyků příkaz goto podporuje (např. C, C++, některé skriptovací jazyky, assemblery). Mnoho moderních jazyků jej naopak buď vůbec neobsahuje, nebo jej důrazně nedoporučuje používat. V Javě je goto rezervované slovo, ale nelze ho použít. (Rezervované slovo je slovo, které je součástí programovacího jazyka a nelze ho použít k jiným účelům, například k pojmenování proměnných.)
Teorie a kritika
V informatice existuje teorie nazývaná věta o strukturovaném programu (Böhm–Jacopini, 1966). Tato věta říká, že jakýkoli program lze přepsat tak, aby se řídil strukturami jako jsou sekvence, výběry (if/else) a smyčky (while/for), případně pomocí volání funkcí a metod, bez použití příkazu goto. Z toho plyne, že příkaz goto není z hlediska účelu programování nezbytný.
Kritika goto se soustředí hlavně na:
- čtení a údržbu kódu: časté skoky mohou vést ke „spaghetti kódu“, kde je těžké sledovat tok programu;
- formální ověřitelnost: kód s mnoha goty je složitější analyzovat a testovat;
- modularitu a použití struktur: použití funkcí/metod obvykle vede k lépe organizovanému a znovupoužitelnému kódu.
Alternativy
Mnohé konstrukce nahrazují nebo omezují potřebu goto:
- smyčky (for, while),
- podmíněné příkazy (if/else, switch),
- přerušení a pokračování smyček (break, continue),
- výjimky a zvláštní mechanizmy pro úklid (try/finally),
- návrat z funkcí/procedur a předávání řízení pomocí volání funkcí.
Kdy je použití goto přijatelně?
Přestože je obecně doporučeno goto omezit, existují situace, kdy je jeho použití odůvodněné nebo pragmatické:
- kód nízké úrovně nebo v assembleru, kde není žádná strukturovaná alternativa,
- efektivní implementace stavových strojů nebo generovaného kódu,
- úklid a ošetření chyb v jazycích bez výjimek (v C je běžný vzor: více kroků inicializace, na chybě goto na cleanup),
- rychlé opuštění z více vnořených smyček (i když mnohé jazyky nabízejí označené breaky/continue jako čistší alternativu).
Praktické rady
- Používejte goto výjimečně a jen tam, kde to zjednoduší čitelnost nebo opraví výrazný opakovací vzor (např. cleanup při chybě).
- Pokud už goto používáte, používejte jasné, popisné štítky a komentáře, které vysvětlí důvod přeskoku.
- V jazykách s bohatšími konstrukcemi preferujte strukturované alternatyvy (funkce, výjimky, označené breaky), které zlepšují udržovatelnost.
Technické poznámky
V některých jazycích platí technická omezení při skoku pomocí goto. Například v C/C++ může skok přes inicializaci objektu s nektriviálním konstruktorem způsobit nedefinované chování; také nelze skákat mezi funkcemi. V jiných jazycích jsou skoky více omezené nebo zcela zakázané.
Stručně řečeno: goto je jednoduchý a mocný nástroj nízké úrovně, ale ve většině případů jej lze nahradit přehlednějšími a bezpečnějšími konstrukcemi. Znalost jeho existence a vlastností je užitečná, ale rozumné použití a preference strukturovaného kódu vede k lepší údržbě a spolehlivosti programů.