Passer au contenu principal
eLearner.app
Module 2 · Leçon 1 sur 56/50 dans le cours~10 min
Leçons du module (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

Exercice#go.m2.l1.e1
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Exercice#go.m2.l1.e2
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Quiz#go.m2.l1.e3
Prêt

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)
Options de réponse

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.