goto er en erklæring i mange programmeringssprog. Det er en kombination af de engelske ord go og to. Det er en måde at springe til en anden kodelinje på.

Mange sprog understøtter goto-erklæringen, og mange gør ikke. I Java er goto et reserveret ord, men kan ikke bruges. (Et reserveret ord er et ord, der er en del af programmeringssproget og ikke kan bruges til andre ting, f.eks. til at navngive variabler).

Inden for datalogi findes der en teori, der kaldes det strukturerede programteorem. Denne teori siger, at ethvert program kan skrives på en sådan måde, at tingene udføres med funktioner og metoder (mindre underprogrammer) i stedet for i et meget stort program og goto-angivelser. Teorien beviser, at goto-erklæringen ikke er nødvendig for at skrive programmer.

Hvad gør goto konkret?

goto springer udførelsen direkte til en mærket (label) sted i samme funktion eller blok. Labels er normalt et navn efterfulgt af et kolon, f.eks. label:. Når koden når en goto label;, fortsætter programmet udførelsen fra den linje, hvor label er defineret.

Eksempler

Her er et simpelt eksempel i C:

int i = 0; start:     if (i >= 3) goto end;     printf("%d\n", i);     i++;     goto start; end:     return 0; 

Et andet typisk mønster i C er at bruge goto til oprydning ved fejl (clean-up):

FILE *f = fopen("fil", "r"); if (!f) return -1; /* ... */ if (fejl) goto cleanup; /* ... */ cleanup:     if (f) fclose(f);     return status; 

Når er goto nyttigt?

  • Low-level programmering og assembly-lignende kode, hvor direkte hop er naturligt.
  • Genereret kode (f.eks. værktøjer der skriver kode automatisk), hvor strukturerede kontroller kan være svære at skabe.
  • Fejlhåndtering i visse sprog (fx C) hvor undtagelser ikke findes — goto til et cleanup-afsnit kan give mere overskuelig oprydning end dybe if/else-kæder.
  • Enkelte performance-kritiske tilfælde, hvor kompilatoren ikke kan optimere alternative strukturer lige så godt — men det er sjældent nødvendig i moderne kode.

Kritik og historie

I 1968 skrev Edsger W. Dijkstra det berømte brev "Go To Statement Considered Harmful", hvor han argumenterede for, at brug af goto ofte fører til uoverskuelig, sværvedligeholdelig "spaghetti-kode". Det har været et vigtigt vendepunkt i programmeringspraksis og medvirkede til fremme af struktureret programmering.

Kritikken går på, at ubegrænset hopping rundt i kode gør kontrolflow svært at følge, hvilket øger risikoen for fejl og gør kode vanskelig at teste og ændre.

Alternativer til goto

I moderne sprog og god praksis anbefales ofte følgende alternativer:

  • Funktioner/metoder: Opdel kode i mindre, genanvendelige enheder.
  • Kontrolstrukturer: if, for, while, switch — giver klart og læsbart flow.
  • Break/continue/return: Til at springe ud af loops eller afslutte en funktion tidligt på en læselig måde.
  • Undtagelser (exceptions): Bruges til at håndtere fejl og oprydning i sprog, der understøtter dem (f.eks. Java, C#, Python).
  • Labeled breaks/continues: Nogle sprog (f.eks. Java) har etiketterede breaks/continues, som kan erstatte visse goto-mønstre på en mere kontrolleret måde.

Hvilke sprog har goto?

  • Mange ældre sprog inkluderer goto: BASIC, Fortran, C, C++, Pascal, Assembly.
  • Nogle sprog reserverer ordet men lader det ikke bruges — f.eks. Java reserverer goto, men implementerer det ikke.
  • Andre moderne sprog undgår det bevidst (f.eks. Rust har ikke goto), mens visse sprog (Perl, PHP) tilbyder kontrolstrukturer med lignende funktionalitet.
  • Python har ikke en indbygget goto; tredjepartsmoduler har forsøgt at tilføje det, men det er ikke almindeligt brugt eller anbefalet.

Praktiske anbefalinger

  • Sørg for læsbarhed: Undgå goto i almindelig applikationskode. Brug strukturerede alternativer, så andre nemt kan forstå flowet.
  • Brug goto med omtanke: Hvis du af praktiske grunde bruger goto (fx i C til clean-up eller i lavniveau-kode), begræns det til små, velkommenterede områder og dokumentér hvorfor.
  • Refaktor om muligt: Hvis du arver kode med mange goto'er, overvej at refaktorisere til funktioner og klare kontrolstrukturer for bedre vedligeholdelse.

Konklusion

goto er et simpelt, men kraftfuldt værktøj: det giver mulighed for direkte hop i koden, men kan hurtigt gøre kode uoverskuelig. Struktureret programmering viser, at de fleste problemer kan løses uden goto, og nutidig praksis anbefaler derfor at foretrække klare kontrolstrukturer, funktioner og undtagelseshåndtering. Alligevel har goto stadig legitime anvendelser i visse lavniveau- og fejloprydningstilfælde — brug det kun når fordelene klart opvejer de potentielle problemer.