Vai al contenuto
eLearner.app
Modulo 2 · Lezione 1 di 56/50 nel corso~10 min
Lezioni del modulo (1/5)

if, else e statement di init

In Go la sintassi di if è quella classica ma con due differenze importanti rispetto a C/Java: niente parentesi attorno alla condizione, e la possibilità di dichiarare una variabile temporanea direttamente nell'if (lo statement di init).

Sintassi base

Go
if temperatura > 30 {
    fmt.Println("caldo")
} else if temperatura > 20 {
    fmt.Println("mite")
} else {
    fmt.Println("fresco")
}

Le graffe sono obbligatorie, anche per blocchi di una sola riga. La condizione deve essere di tipo bool: niente "truthiness" alla Python o JS.

Go
n := 0
// if n { ... }   // ERRORE: int non è bool
if n != 0 { ... }  // ok

Statement di init: scope limitato all'if

Puoi dichiarare una variabile valida solo all'interno di if/else, separandola dalla condizione con ;:

Go
if v, err := call(); err == nil {
    fmt.Println("ok", v)
} else {
    fmt.Println("ko", err)
}
// qui v ed err NON esistono più

È il pattern idiomatico per gestire errori senza inquinare lo scope esterno.

Shadowing nello scope dell'if

Se una variabile esterna viene "oscurata" dall'init, dentro all'if vince la versione locale. Subito dopo, riemerge quella esterna.

Go
x := 10
if x := 3; x > 5 {
    fmt.Println("dentro:", x)  // mai stampato (3 < 5)
} else {
    fmt.Println("else:", x)    // 3
}
fmt.Println("dopo:", x)         // 10 — quella esterna

Niente operatore ternario

Go non ha cond ? a : b. Per assegnazioni condizionali serve un if/else in 3-4 righe — è scelta di design per privilegiare leggibilità.

Go
var label string
if age >= 18 {
    label = "adulto"
} else {
    label = "minore"
}

Prova tu

Esercizio#go.m2.l1.e1
Tentativi: 0Caricamento…

Stampa 'positivo', 'zero' o 'negativo' a seconda del valore di n.

Caricamento editor…
Mostra suggerimento

Catena `if / else if / else` con condizioni sui segni.

Soluzione disponibile dopo 3 tentativi

Esercizio#go.m2.l1.e2
Tentativi: 0Caricamento…

Usa lo statement di init per dichiarare v := 42 nell'if e stamparla solo se v >= 18.

Caricamento editor…
Mostra suggerimento

Sintassi: `if init; condizione { ... }`.

Soluzione disponibile dopo 3 tentativi

Quiz#go.m2.l1.e3
Pronto

Cosa stampa questo programma?

Go
x := 10
if x := 3; x > 5 {
    fmt.Println("dentro:", x)
} else {
    fmt.Println("else:", x)
}
fmt.Println("dopo:", x)
Opzioni di risposta

Recap

  • Condizioni senza parentesi, graffe sempre obbligatorie.
  • La condizione deve essere bool: niente truthiness implicita.
  • Init if v, err := f(); err == nil { ... } limita lo scope di v ed err.
  • Shadowing nell'init: occhio a non oscurare variabili esterne.
  • Nessun ternario: scrivi un if/else espanso.