Per gestire la logica di un programma si ricorre a due meccanismi di fondo: i costrutti condizionali per determinare se del codice deve essere eseguito o meno; i cicli con cui una porzione di
codice potrà essere eseguita più volte.
Prima però di vederli è necessario conoscere operatori di confronto e logici.
Operatori di confronto e logici
Gli operatori di confronto restituiscono un valore booleano e sono: == (uguale), > (maggiore), < (minore), >= (maggiore o uguale), <= (minore o uguale), != diverso.I confronti
che sono realizzabili tramite questi possono ulteriormente essere combinati tra loro mediante operatori logici quali:
- && (AND): restituisce
true
solo se i suoi operandi sono entrambi veri; - || (OR): restituisce
false
solo se entrambi i suoi operatori sono falsi; - ! (NOT): inverte il valore logico dell'espressione che lo segue.
Ecco qualche esempio dimostrativo:
func main(){
fmt.Println("5 è maggiore di 4? ", (5>4))
fmt.Println("5 è minore o uguale di 3? ", (5<=3))
fmt.Println("8 è compreso tra 4 e 12?", (8>=4 && 8<=12))
}
Eseguendolo otterremmo questo in output:
5 è maggiore di 4? true
5 è minore o uguale di 3? false
8 è compreso tra 4 e 12? true
Come possiamo vedere le espressioni riportate tra parentesi tonde hanno dato vita a valori booleani che sono stati poi stampati.
Costrutti condizionali
Il più comune costrutto condizionale è senza ombra di dubbio if
. Questo introduce un'espressione booleana che, se vera, porta all'esecuzione del codice che lo segue. Ad esempio:
eta:=16
if eta<18 {
fmt.Println("Accesso vietato: sei minorenne")
}
Il messaggio verrà stampato solo se la variabile eta
è minore di 18. Possiamo usare anche la parola chiave else
per specificare quale codice eseguire nel caso la
condizione sia falsa. Nell'esempio che segue verrà stampata una frase ad hoc a seconda che l'età indichi una persona maggiorenne o meno:
eta:=21
if eta<18 {
fmt.Println("Accesso vietato: sei minorenne")
} else {
fmt.Println("Entra pure: sei maggiorenne")
}
Tra if
e else
si possono interrompere anche dei blocchi else if
che, in caso di fallimento dell'if
, specificano condizioni ulteriori da verificare.
Verrà eseguito solo il codice relativo alla prima condizione verificata mentre, dovessero risultare tutte false, si eseguirebbe il blocco dell'else
:
eta:=12
if eta<14 {
fmt.Println("Accesso vietato: troppo piccolo")
} else if eta<18{
fmt.Println("Entra pure ma solo nella zona per minorenni")
} else {
fmt.Println("Accesso completo perchè sei maggiorenne")
}
Qualora si dovesse valutare una variabile che può avere solo determinati valori è disponibile lo switch...case
: con switch
si introduce l'espressione da valutare ed ogni case
indica il blocco
di codice da eseguire in corrispondenza di un determinato valore: possiamo considerarla una forma di "if/else if" più compatta. Alla fine si può indicare con default
un possibile codice da eseguire
qualora nessun valore dei case
venisse riscontrato. Ecco un esempio in cui diamo un giudizio su una recensione i cui valori accettabili vanno da 1 a 5:
recensione:=12
switch recensione{
case 1:
fmt.Println("1 stella: recensione bassissima")
case 2:
fmt.Println("2 stelle: recensione bassa")
case 3:
fmt.Println("3 stelle: recensione media")
case 4:
fmt.Println("4 stelle: recensione alta")
case 5:
fmt.Println("5 stelle: recensione ottima")
default:
fmt.Println("Valore non consentito")
}
Cicli
Anche i cicli si basano su condizioni booleane e sono imperniati sulla parola chiave for
. La sua forma completa vede l'uso di tre statement: il primo per l'inizializzazione di una
variabile contatore; il secondo per indicare la condizione la cui veridicità comporterà la prosecuzione del ciclo; il terzo per specificare la modalità di variazione della variabile contatore.
Ad esempio, nel seguente codice inizializziamo la variabile i
a 1 e la incrementiamo di due unità finchè non raggiunge o supera 20. Ad ogni iterazione verrà stampato il valore della variabile:
for i:=1; i<20; i+=2{
fmt.Println(i)
}
Il risultato a console sarà il seguente:
1
3
5
7
9
11
13
15
17
19
Stesso output si potrebbe ottenere lasciando solo la condizione da verificare legata al for
(elemento indispensabile) ed esportando inizializzazione ed integrazione della variabile contatore
in altri punti.
k:=1
for k<20 {
fmt.Println(k)
k+=2
}