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ů.