goto är ett uttalande i många programmeringsspråk. Det är en kombination av de engelska orden go och to. Det är ett sätt att hoppa till en annan kodrad.
Många språk har stöd för goto-angivelsen, men många har det inte. I Java är goto ett reserverat ord, men kan inte användas. (Ett reserverat ord är ett ord som är en del av programmeringsspråket och som inte kan användas för andra saker, t.ex. för att namnge variabler).
Inom datavetenskap finns det en teori som kallas teorin om strukturerade program. Denna teori säger att alla program kan skrivas på ett sådant sätt att saker och ting görs med hjälp av funktioner och metoder (mindre underprogram) i stället för i ett mycket stort program och goto-satser. Teorin bevisar att goto-satsen inte behövs för att skriva program.
Vad är goto — enkelt förklarat
goto är ett kontrollflödesuttryck som gör att exekveringen fortsätter på en annan plats i samma program, vanligen markerad med en etikett (label). I lågnivå- och assemblerkod motsvarar det ofta ett obetingat hopp (jump).
Syntax och exempel
Syntaxen varierar mellan språk, men grundidén är densamma: man anger en etikett och hoppar till den. Ett enkelt exempel i C:
int main() { int i = 0; start: if (i >= 3) goto end; printf("%d\n", i); i++; goto start; end: return 0; } Observera att vissa språk (t.ex. C och C++) begränsar hoppets räckvidd (oftast inom samma funktion) och att hopp över variabelinitialisering kan leda till odefinierat beteende.
Användningsområden där goto fortfarande förekommer
- Felhantering och städning i språk utan undantag eller där man vill undvika dubblettkod (exempel: flera resurser ska frigöras vid fel). Ett vanligt idiom i C är att använda goto för att hoppa till en gemensam rengöringssektion.
- Genererade programkod eller kompilerare där hopp kan göra koden enklare eller effektivare.
- Prestandakritisk kod eller mycket enkla state‑maskiner där andra konstruktioner skulle ge onödig overhead.
- Att bryta ut ur flera nästlade loopar i vissa språk där det saknas ett enkelt språkstöd (i Java finns dock märkta bryt/fortsätt-funktioner i viss mån).
Kritik och varför många avråder från goto
- Spaghettikod: Många osystematiska hopp kan göra koden svår att läsa, förstå och underhålla.
- Komplex felsökning och testning: Icke-linjära hopp ökar komplexiteten i programflödet och gör det svårare att analysera alla vägar.
- Strukturerad programmering: Teorier som Böhm–Jacopini visar att strukturerade kontrollkonstruktioner (sekvens, selektion, iteration) räcker för att uttrycka beräkningsbarhet utan goto. Därtill kritiserade Edsger Dijkstra goto i den berömda essän "Go To Statement Considered Harmful".
Alternativ till goto
- Loopar (for, while, do-while) och villkorssatser (if/else).
- Funktioner/metoder — dela upp logik i mindre enheter för bättre läsbarhet.
- Undantag (exceptions) eller språkets inbyggda felhanteringsmekanismer.
- Strukturer som break/continue eller märkta break i språk som stödjer det (t.ex. Java har märkta loop-brytningar).
Språkexempel — vilka språk har goto?
- Har goto: C, C++, PHP, Perl, många assemblrar, Fortran, C# (men med begränsningar).
- Reserverat men otillgängligt: Java (som i exemplet ovan).
- Har ej standardgoto: Python saknar en goto-sats i standardbiblioteket (det finns en icke-standard "goto"-modul som mest är ett skämt/experiment).
Råd till utvecklare
- Använd goto sparsamt — bara när det gör koden klarare eller när det finns praktiska skäl (t.ex. centraliserad städning vid fel i C).
- Föredra strukturerade kontrollflöden och små funktioner för bättre läsbarhet och underhåll.
- Vid användning: dokumentera tydligt varför goto används och håll hoppingens räckvidd kort.
Sammanfattningsvis är goto en kraftfull men kontroversiell konstruktion: tekniskt onödig i ljuset av strukturerad programmering, men ibland praktisk i låg nivå eller specialfall. För det mesta ger tydligare kontrollstrukturer och bättre design samma funktionalitet med bättre underhållbarhet.