goto în Go

Sare la o etichetă din aceeași funcție. Rar folosit; for, break și return sunt aproape mereu mai clare.

Sintaxă
goto Eticheta
...
Eticheta:
    instructiune

Ce face goto

goto Eticheta mută execuția la instrucțiunea marcată cu Eticheta:, în aceeași funcție. Compilatorul refuză saltul peste declarații de variabile (dacă variabila ar fi folosită după etichetă) și saltul în interiorul unui bloc.

În codul Go obișnuit goto aproape nu apare: buclele, break cu etichetă, defer și return rezolvă aceleași probleme mai clar. Îl întâlnești ocazional în cod generat automat sau în bucle de reîncercare foarte scurte.

Parametri

Parametru Descriere
Eticheta Un nume urmat de : înaintea unei instrucțiuni din aceeași funcție. O etichetă nefolosită este eroare de compilare.

Exemple

Exemplul 1: Reîncercare simplă cu goto

Aceeași logică se scrie mai clar cu un for; exemplul arată doar cum funcționează saltul.

package main

import "fmt"

func main() {
    incercari := 0
Reincearca:
    incercari++
    fmt.Println("conectare, încercarea", incercari)
    if incercari < 3 {
        goto Reincearca
    }
    fmt.Println("conectat după", incercari, "încercări")
}

Rezultat

conectare, încercarea 1
conectare, încercarea 2
conectare, încercarea 3
conectat după 3 încercări

Exemplul 2: Varianta recomandată cu for

package main

import "fmt"

func main() {
    incercari := 0
    for {
        incercari++
        fmt.Println("conectare, încercarea", incercari)
        if incercari >= 3 {
            break
        }
    }
    fmt.Println("conectat după", incercari, "încercări")
}

Rezultat

conectare, încercarea 1
conectare, încercarea 2
conectare, încercarea 3
conectat după 3 încercări

Greșeli frecvente

  • goto peste o declarație: goto X; n := 1; X: fmt.Println(n) dă goto X jumps over declaration of n.
  • Etichetă declarată, dar nefolosită: label X defined and not used.

Comenzi înrudite

  • for: Singura buclă din Go: forma clasică, forma „while”, bucla infinită și parcurgerea cu range.
  • break: Oprește imediat cea mai apropiată buclă for, switch sau select; cu etichetă oprește o buclă exterioară.
  • continue: Sare peste restul iterației curente și trece la următoarea iterație a buclei for.