if și else în Go

Execută un bloc de cod doar dacă o condiție este adevărată; else tratează cazul contrar.

Sintaxă
if conditie {
    // ...
} else if alta {
    // ...
} else {
    // ...
}

if v := calcul(); v > 0 {
    // v există doar în if/else
}

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

  • else pe rândul următor după }: Go pune automat ; la final de rând, deci } urmat de else pe alt rând dă eroarea syntax error: unexpected keyword else, expected }.
  • if x { ... } cu x număr sau text: Go nu are „truthy”, condiția trebuie să fie bool.
  • Folosirea în afara lui if a 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.