Condizionali IF in Go
L’istruzione if in Go e uno dei costrutti fondamentali per il controllo del flusso di esecuzione. A differenza di altri linguaggi, Go non richiede parentesi tonde attorno alla condizione, ma le parentesi graffe sono sempre obbligatorie. In questa guida vedremo tutte le forme dell’istruzione if disponibili in Go.
Istruzione if di Base
La forma piu semplice dell’istruzione if valuta una condizione booleana e, se vera, esegue il blocco di codice associato.
package main
import "fmt"
func main() {
eta := 20
if eta >= 18 {
fmt.Println("Sei maggiorenne")
}
}
Nota che in Go non servono le parentesi tonde attorno alla condizione, ma le parentesi graffe {} sono obbligatorie anche quando il blocco contiene una sola istruzione.
Istruzione if-else
Con else possiamo definire un blocco di codice alternativo da eseguire quando la condizione e falsa.
temperatura := 30
if temperatura > 25 {
fmt.Println("Fa caldo")
} else {
fmt.Println("La temperatura e gradevole")
}
Importante: la parola chiave else deve trovarsi sulla stessa riga della parentesi graffa di chiusura del blocco if. Questo e imposto dal compilatore Go.
Istruzione if-else if-else
Per gestire condizioni multiple in sequenza si utilizza la catena if-else if-else.
voto := 85
if voto >= 90 {
fmt.Println("Eccellente")
} else if voto >= 80 {
fmt.Println("Buono")
} else if voto >= 70 {
fmt.Println("Sufficiente")
} else if voto >= 60 {
fmt.Println("Mediocre")
} else {
fmt.Println("Insufficiente")
}
Le condizioni vengono valutate dall’alto verso il basso e il primo ramo la cui condizione risulta vera viene eseguito. Se nessuna condizione e vera, viene eseguito il blocco else finale.
Istruzione if con Inizializzazione (Short Statement)
Una caratteristica distintiva di Go e la possibilita di inserire una breve istruzione prima della condizione, separata da un punto e virgola. La variabile dichiarata in questa istruzione e visibile soltanto all’interno del blocco if e dei blocchi else associati.
package main
import (
"fmt"
"math"
)
func main() {
if v := math.Sqrt(144); v > 10 {
fmt.Printf("La radice quadrata e %.0f, che e maggiore di 10\n", v)
} else {
fmt.Printf("La radice quadrata e %.0f, che non supera 10\n", v)
}
// v non e accessibile qui fuori dal blocco if
}
Questo pattern e estremamente comune in Go, soprattutto per la gestione degli errori:
if err := eseguiOperazione(); err != nil {
fmt.Println("Errore:", err)
return
}
La variabile err esiste solo nello scope del blocco if, mantenendo il codice pulito e le variabili confinate dove servono.
Istruzioni if Nidificate
E possibile inserire un if all’interno di un altro if per gestire condizioni complesse.
utente := "admin"
attivo := true
if utente == "admin" {
if attivo {
fmt.Println("Accesso completo al pannello di amministrazione")
} else {
fmt.Println("Account admin disattivato")
}
} else {
fmt.Println("Accesso limitato")
}
Tuttavia, e buona pratica evitare nidificazioni eccessive. Spesso si puo semplificare il codice usando ritorni anticipati:
func verificaAccesso(utente string, attivo bool) string {
if utente != "admin" {
return "Accesso limitato"
}
if !attivo {
return "Account admin disattivato"
}
return "Accesso completo al pannello di amministrazione"
}
Condizioni con Operatori Logici
Le condizioni possono essere combinate usando gli operatori logici && (AND), || (OR) e ! (NOT).
eta := 25
haPatente := true
if eta >= 18 && haPatente {
fmt.Println("Puoi guidare")
}
if eta < 16 || !haPatente {
fmt.Println("Non puoi guidare")
}
Conclusione
L’istruzione if in Go e semplice nella sintassi ma potente nell’utilizzo. La possibilita di includere una short statement prima della condizione e una caratteristica tipica di Go che favorisce un codice conciso e leggibile. Ricorda che le parentesi graffe sono sempre obbligatorie e che le variabili dichiarate nella short statement hanno scope limitato al blocco condizionale.