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
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.
n := 0
// if n { ... } // ERRORE: int non è bool
if n != 0 { ... } // okStatement di init: scope limitato all'if
Puoi dichiarare una variabile valida solo all'interno di if/else,
separandola dalla condizione con ;:
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.
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 esternaNiente 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à.
var label string
if age >= 18 {
label = "adulto"
} else {
label = "minore"
}Prova tu
Stampa 'positivo', 'zero' o 'negativo' a seconda del valore di n.
Mostra suggerimento
Catena `if / else if / else` con condizioni sui segni.
Soluzione disponibile dopo 3 tentativi
Usa lo statement di init per dichiarare v := 42 nell'if e stamparla solo se v >= 18.
Mostra suggerimento
Sintassi: `if init; condizione { ... }`.
Soluzione disponibile dopo 3 tentativi
Cosa stampa questo programma?
x := 10
if x := 3; x > 5 {
fmt.Println("dentro:", x)
} else {
fmt.Println("else:", x)
}
fmt.Println("dopo:", x)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 divederr. - Shadowing nell'init: occhio a non oscurare variabili esterne.
- Nessun ternario: scrivi un
if/elseespanso.