Ce face if și else
if verifică o condiție de tip bool și execută blocul dintre acolade doar dacă ea este adevărată. Ramura else se execută când condiția este falsă, iar else if adaugă alte condiții verificate pe rând, de sus în jos.
În Go condiția nu se pune între paranteze, dar acoladele sunt obligatorii, chiar și pentru o singură instrucțiune. Acolada de deschidere stă pe același rând cu if, iar else stă pe același rând cu acolada care închide blocul anterior.
Înaintea condiției poți scrie o instrucțiune scurtă, separată prin punct și virgulă: if n, err := strconv.Atoi(s); err != nil { ... }. Variabilele declarate acolo există doar în if și în ramurile lui else. Acesta este felul obișnuit de a verifica erorile în Go.
Parametri
| Parametru | Descriere |
|---|---|
conditie |
O expresie de tip bool. Go nu transformă automat numere sau texte în bool: if n nu compilează, scrii if n != 0. |
instrucțiune scurtă |
Opțională, înaintea condiției, urmată de ;. De obicei o declarație :=. |
Exemple
Exemplul 1: Calificativul unei note
Condițiile se verifică de sus în jos; se execută doar prima ramură adevărată.
package main
import "fmt"
func calificativ(nota int) string {
if nota >= 9 {
return "foarte bine"
} else if nota >= 7 {
return "bine"
} else if nota >= 5 {
return "suficient"
} else {
return "insuficient"
}
}
func main() {
for _, nota := range []int{10, 8, 5, 3} {
fmt.Printf("nota %2d: %s\n", nota, calificativ(nota))
}
}
Rezultat
nota 10: foarte bine
nota 8: bine
nota 5: suficient
nota 3: insuficient
Exemplul 2: Instrucțiune scurtă înaintea condiției
n și err există doar în if și else. Așa se verifică de obicei erorile în Go.
package main
import (
"fmt"
"strconv"
)
func main() {
for _, text := range []string{"42", "patru"} {
if n, err := strconv.Atoi(text); err != nil {
fmt.Println("nu este număr:", text)
} else {
fmt.Println("dublul lui", n, "este", n*2)
}
}
}
Rezultat
dublul lui 42 este 84
nu este număr: patru
Exemplul 3: Returnare timpurie în loc de else
În Go se preferă tratarea cazului greșit la început, cu return, ca restul funcției să nu fie indentat într-un else.
package main
import "fmt"
func plata(sold, suma float64) string {
if suma <= 0 {
return "sumă invalidă"
}
if suma > sold {
return fmt.Sprintf("fonduri insuficiente: lipsesc %.2f lei", suma-sold)
}
return fmt.Sprintf("plată reușită, rămân %.2f lei", sold-suma)
}
func main() {
fmt.Println(plata(150, 0))
fmt.Println(plata(150, 200))
fmt.Println(plata(150, 49.5))
}
Rezultat
sumă invalidă
fonduri insuficiente: lipsesc 50.00 lei
plată reușită, rămân 100.50 lei
Greșeli frecvente
elsepe rândul următor după}: Go pune automat;la final de rând, deci}urmat deelsepe alt rând dă eroareasyntax error: unexpected keyword else, expected }.if x { ... }cuxnumăr sau text: Go nu are „truthy”, condiția trebuie să fiebool.- Folosirea în afara lui
ifa unei variabile declarate în instrucțiunea scurtă: ea nu mai există după acolada finală.
Comenzi înrudite
switch, case și default: Alege una din mai multe ramuri după valoarea unei expresii sau după prima condiție adevărată.for: Singura buclă din Go: forma clasică, forma „while”, bucla infinită și parcurgerea cu range.erori (error): În Go erorile sunt valori: funcțiile returnează un error, iar apelantul verifică if err != nil.