Goto je príkaz v mnohých programovacích jazykoch, ktorý umožňuje presun toku vykonávania programu na iné miesto v kóde. Názov vznikol kombináciou anglických slov go a to. V praxi ide o priamy skok (jump) na označený riadok alebo štítok v rámci programu.

Definícia a pozadie

Príkaz goto vykoná skok na vopred definovaný štítok (label), ktorý je súčasťou zdrojového kódu. V niektorých jazykoch je tento mechanizmus priamo podporovaný; iné jazyky ho buď nepodporujú, alebo majú jeho použitie obmedzené. Napríklad v jazyku Java je príkaz goto rezervovaný, ale programátor ho nemôže použiť. (Rezervované slovo je slovo, ktoré je súčasťou programovacieho jazyka a nemôže sa používať na iné veci, napríklad na pomenovanie premenných.)

Syntax a jednoduché príklady

Konkrétna syntax závisí od jazyka. Typický tvar v jazykoch ako C vyzerá takto:

if (chyba) goto error; ... error:   // čistiace operácie alebo návrat s chybou 

V jazykoch, ktoré goto nepodporujú (napr. Python), sa na dosiahnutie podobných efektov používajú iné konštrukcie — funkcie, výnimky alebo explicitné riadiace štruktúry.

Praktické použitie

Aj keď sa používanie goto často kritizuje, v niektorých situáciách môže byť užitočné:

  • Úsporné riešenie pri uvoľňovaní zdrojov a ošetrení chýb — v C je bežné použiť goto k preskoku na centrálny blok čistenia (error handling) z rôznych miest funkcie.
  • Implementácia nízkoúrovňových algoritmov alebo stavových automatov, kde je explicitný skok prirodzený (napríklad pri generovaní assembleru alebo v interpretoch).
  • Optimalizácia pri špecifických časovo kritických úsekoch tam, kde strukturované alternatívy zbytočne komplikujú kód.

Kritika a obmedzenia

Hlavné argumenty proti používaniu goto sú:

  • Čitateľnosť: Voľné skoky môžu spôsobiť, že tok programu je ťažko sledovateľný — vzniká takzvaný "spaghetti code".
  • Údržba: Kód s mnohými skokmi sa ťažšie modifikuje a testuje; zmeny môžu mať neočakávané vedľajšie účinky.
  • Bezpečnosť: Nesprávne použité skoky môžu obchádzať konštrukcie zodpovedné za uvoľňovanie zdrojov (napr. inicializácie alebo deštruktory), ak jazyk alebo konvencia nevynúti bezpečné správanie.

V informatike existuje teória nazývaná veta o štruktúrovanom programe, ktorá dokazuje, že každý program možno napísať pomocou obmedzeného súboru štruktúr (sekvencia, výber, cyklus) bez potreby príkazu goto. Táto teória sa často používa ako argument v prospech štruktúrovaného programovania a proti nadmernému používaniu skokov.

Alternatívy k príkazu goto

  • Rozdelenie kódu do menších funkcií a metód — zvyšuje čitateľnosť a opätovnú použiteľnosť.
  • Výnimky a mechanizmy na ich spracovanie — slúžia na prerušovanie bežného toku pri chybách a sú bezpečnejšie z hľadiska uvoľňovania zdrojov.
  • Štruktúrované riadiace konštrukcie (break, continue, return) a explicitné stavové stroje, ktoré často dokážu nahradiť potrebu skokov.
  • V niektorých jazykoch existujú bezpečnejšie varianty alebo migrované konštrukcie (napr. labeled break v jazykoch ako Java — hoci Java priamo goto neumožňuje).

Dobre známe prístupy k používaniu

  • Používajte goto len v odôvodnených prípadoch (napr. centralizované čistenie v C), nie ako bežný spôsob riadenia toku.
  • Ak použijete skoky, označte štítky jasnými menami a pridajte komentáre, aby bol účel zrejmý.
  • Preferujte modularitu — rozdelenie komplexnej funkcie na menšie časti často odstraňuje potrebu skokov.

Zhrnutie

Príkaz goto je jednoduchý a mocný nástroj, ktorý umožňuje priame skoky v programe. Napriek tomu jeho používanie prináša riziká pre čitateľnosť a udržiavateľnosť kódu, preto ho väčšina programátorov a štýlových smerníc odporúča používať striedmo a uvážlivo. V mnohých jazykoch sú k dispozícii alternatívy, ktoré zabezpečia jasnejší a bezpečnejší tok programu, pričom teória štruktúrovaného programovania dokazuje, že goto nie je nevyhnutný pre vyjadrenie všetkých programových logík.