Goto ir paziņojums daudzās programmēšanas valodās. Nosaukums nāk no angļu vārdiem go un to — tas izsaka pāriešanu (lēcienu) uz citu programmas koda rindu vai etiķeti. Praktiski goto liek izpildei turpināties no iepriekš definētas vietas, ko parasti apzīmē ar etiķeti (label).
Sintakse un vienkāršs piemērs
Precīza sintakse atšķiras atkarībā no valodas, bet pamatideja ir līdzīga: definē etiķeti un pēc tam izmanto goto, lai pārvietotos uz šo etiķeti. Piemērs C valodā:
int main() { int x = 0; start: x++; if (x < 3) goto start; return 0; } Šajā piemērā izpilde atgriežas pie etiķetes start tikmēr, kamēr x < 3 — tas ir vienkāršs cikla modelis, ko šādā gadījumā vieglāk izteikt ar while vai for, bet goto to pieļauj arī tādā formā.
Kur goto tiek atbalstīts un kur nē
Daudzas valodas atbalsta goto izteikumu (piemēram, montāžas valodas, C, C++ un daudzas citas), bet citās valodās tas ir aizliegts vai tikai rezervēts vārds. Java valodā goto ir rezervēts vārds, bet to nevar izmantot. (Rezervēts vārds ir vārds, kas ir programmēšanas valodas sastāvdaļa un ko nevar izmantot, piemēram, mainīgo nosaukšanai.) Dažās modernajās valodās, kuru dizains balstās uz struktūrām un izņēmumiem, goto netiek izmantots vai tiek lietots tikai īpašos gadījumos.
Kritika un strukturētā programmēšana
Datorzinātnē pastāv teorija, ko sauc par strukturēto programmu teorēmu. Šī teorija rāda, ka jebkuru programmu var uzrakstīt, izmantojot tikai blokus, izvēles un ciklus (vai, praktiski, funkcijas un metodes) — bez nepieciešamības pēc goto. No šīs idejas radās kritika pret goto: tā pārmērīga lietošana var novest pie sarežģītas, grūti saprotamas programmas (t.s. "spageti kods"), ko ir viegli salauzt un grūti uzturēt.
Kad goto ir noderīgs
- Kļūdu apstrāde un resursu atbrīvošana: īpaši C valodā, kur nav automātiskas atkritumu savākšanas, goto bieži izmanto kopējai attīrīšanas (cleanup) daļai. Tas ļauj sakārtoti izgāzties no vairākām iekšējām darbībām un izsaukt tīrīšanas kodu vienuviet.
- Izeja no dziļi iestiprinātiem vai vairākām ligzdotām cilpām: reizēm ērtāk un skaidrāk ir iziet uz sākotnēji definētu etiķeti nekā lietot karājošas loģikas konstrukcijas.
- Kompliskas stāvokļu mašīnas vai zema līmeņa optimizācijas: kompilatori bieži pārvērš augstas līmeņa konstrukcijas uz lēcieniem, un dažos reģionos programmētājs var izvēlēties tiešu lēciena izmantošanu, lai iegūtu ātrumu vai precizitāti.
Piemērs: kļūdu apstrāde C valodā
int func() { char *buf = malloc(100); if (!buf) return -1; if (something_failed()) goto error; // citas darbības free(buf); return 0; error: free(buf); return -1; } Šajā piemērā goto izmanto, lai kopīgi apstrādātu kļūdu un atbrīvotu resursus vienā vietā — tas samazina kods dublikāciju.
Alternatīvas un labas prakses
- Mūsdienu augstākā līmeņa valodās bieži lieto
return,break,continue, izņēmumus (exceptions) vai mazas funkcijas/metodes, lai sasniegtu to pašu rezultātu drošāk un pārskatāmāk. - Ja izmantojat goto, dariet to taupīgi: ierobežojiet to uz skaidri definētām vietām (piem., kļūdu apstrādes bloks), dokumentējiet iemeslu un saglabājiet kodu lasāmu.
- Izmantojiet strukturētas programmas principus, sadalot funkcionalitāti loģiskās vienībās — tas bieži ļauj izvairīties no nepieciešamības pēc lēcieniem.
Kopsavilkumā — goto ir jaudīgs instruments, kas ļauj veikt tiešus lēcienus koda iekšienē. Tomēr tās izmantošana prasa piesardzību, jo tas var pasliktināt koda lasāmību un uzturēšanu. Struktūrētā programmēšana pierāda, ka goto nav obligāts, bet praktiskos un zema līmeņa scenārijos to var lietderīgi izmantot.