goto on paljudes programmeerimiskeeltes kasutatav avaldis. See on kombinatsioon ingliskeelsetest sõnadest go ja to. See on viis hüpata teise koodireale või siltmärgiga tähistatud kohta programmis — teisisõnu muuta täitmise voogu otseselt ilma tavapäraste kontrollstruktuurideta (nt tsüklid või tingimuslauseid) või funktsioonikõnedeta.

Kasutamine ja süntaks

Süntaks sõltub keelest. Madalama taseme keeltes (nt assembly) on põhimõtteliselt ainult hüppelaused (jump), samas kõrgetel keeltes nagu C on olemas märgistatud goto-lause, mis näeb välja umbes nii:

label:     // kood     goto label;

Selline hüpe viib täitmise kohe märgistatud kohani. Mõned keeled (näiteks Java) on sõna goto reserveerinud, kuid seda ei saa kasutada. (Reserveeritud sõna on sõna, mis on osa programmeerimiskeelest ja mida ei saa kasutada muudeks asjadeks, näiteks muutujate nimetamiseks).

Näited

Lihtne näide C-st, kus goto viib kontrolli väljapoole tsüklist:

for (int i = 0; i < n; ++i) {     if (tingimus) {         goto lõpp;     }     // muu töö } lõpp: // siit jätkatakse pärast goto-d

Teine sagedane kasutus C-s on vigade käsitlemine ja ressursside vabanemine, kus mitmes kohas võib tekkida viga ja ühest kohast on lihtsam kõike puhastada:

p = malloc(...); if (!p) goto cleanup; q = fopen(...); if (!q) goto cleanup; // kasutame p ja q cleanup: if (q) fclose(q); free(p);

Miks goto on vastuoluline

  • Loetavus ja hooldatavus: liiga palju juhte hüppeid muudab programmi loogika raskesti jälgitavaks — see on tuntud kui "spagettikood".
  • Struktureeritud programmeerimise põhimõtted: arvutiteaduses on teooria, mida nimetatakse struktureeritud programmi teoreemiks. See teooria ütleb, et iga programmi saab kirjutada nii, et asju tehakse funktsioonide ja meetodite (väiksemate alaprogrammide) abil, mitte ühe väga suure programmiga ja goto-käsklustega. Teooria tõestab, et goto-avaldust ei ole programmide kirjutamiseks vaja.
  • Vigade võimalus: juhuslikud hüpped võivad jätta ressursid avatud või jätta initsialiseerimata oleku — raskem on tagada õiged puhastustoimingud.

Millal goto võib olla kasulik

Kuigi üldiselt on kõrgema taseme koodis goto kasutamine ebasoovitav, on mõned praktikalised erandid:

  • Vigade ja erandite käsitlemine C-laadsetes keeltes, kus ei ole automaatset erandisüsteemi — üks puhastuspunkt aitab vältida korduvat koodi.
  • Väljumine mitu tasandit sügavast tsüklist või tingimuse puust, kus muud meetodid teeksid koodi oluliselt keerukamaks.
  • Madala taseme optimeerimine või spetsiifiline riistvaraga suhtlemine assemblys või väga jõudlusnõudlikes osades.

Alternatiivid

Paljud kaasaegsed keeledisainid eelistavad selgemaid konstruktsioone:

  • Funktsioonide ja meetodite kasutamine: jagab programmi loogika väiksemateks ja taaskasutatavateks osadeks.
  • Tsüklite ja standardsete kontrollstruktuuride (if/else, switch, for, while) kasutamine.
  • Erandid (exceptions): keeltes, kus need on kättesaadavad, võimaldavad samaaegselt veahaldust ja puhastust ilma goto-d kasutamata.
  • Varasema väljumise (early return) ja selgete puhastustoimingute mallid: lihtsustavad kontrollvoolu ja vähendavad vajadust hüppede järele.

Keeletugi

Mõned keeled toetavad goto-lauset otse (näiteks C, C++, PHP, Perl, Fortran ja assembly), teised keelavad selle või reserveerivad sõna ilma implementeerimata (Java, Python ei oma tavalist goto-d). Keele kogukondade ja stiilijuhendite soovitused varieeruvad: isegi kui keel lubab goto-d, soovitatakse seda kasutada ainult erandjuhtudel ja selgelt dokumenteeritult.

Kokkuvõttes on goto tööriist, mis annab tugeva kontrollvõimaluse täitmise voo üle, kuid selle kasutamine nõuab ettevaatust — struktureeritud lähenemised, selged abstraktsioonid ja kaasaegsed veahaldusmehhanismid teevad suure osa goto-vajadusest tarbetuks.