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
gotopeste 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.