00
:
00
:
00
:
00
Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Booleani

Il tipo bool in Go

Il tipo bool in Go rappresenta un valore booleano che puo assumere solo due valori: true (vero) o false (falso). I booleani sono fondamentali per il controllo del flusso del programma e per le espressioni condizionali.

Dichiarazione di variabili booleane

Puoi dichiarare variabili booleane in diversi modi:

package main

import "fmt"

func main() {
    // Dichiarazione esplicita con tipo
    var attivo bool = true
    var completato bool = false

    // Dichiarazione con inferenza di tipo
    var visibile = true

    // Dichiarazione breve
    abilitato := true

    fmt.Println(attivo, completato, visibile, abilitato)
}

Valore zero

Il valore zero del tipo bool e false. Questo significa che una variabile booleana dichiarata senza un valore iniziale sara automaticamente false:

package main

import "fmt"

func main() {
    var predefinito bool
    fmt.Println(predefinito) // false

    // Anche nei campi di una struct
    type Configurazione struct {
        ModalitaDebug bool
        Verboso       bool
    }

    config := Configurazione{}
    fmt.Println(config.ModalitaDebug) // false
    fmt.Println(config.Verboso)       // false
}

Operazioni booleane

Go supporta tre operatori logici fondamentali per lavorare con i booleani:

AND logico (&&)

Restituisce true solo se entrambi gli operandi sono true:

package main

import "fmt"

func main() {
    fmt.Println(true && true)   // true
    fmt.Println(true && false)  // false
    fmt.Println(false && true)  // false
    fmt.Println(false && false) // false

    eta := 25
    haPatente := true
    puoGuidare := eta >= 18 && haPatente
    fmt.Println("Puo guidare:", puoGuidare) // true
}

OR logico (||)

Restituisce true se almeno uno degli operandi e true:

package main

import "fmt"

func main() {
    fmt.Println(true || true)   // true
    fmt.Println(true || false)  // true
    fmt.Println(false || true)  // true
    fmt.Println(false || false) // false

    eStudente := true
    eAnziano := false
    haSconto := eStudente || eAnziano
    fmt.Println("Ha sconto:", haSconto) // true
}

NOT logico (!)

Inverte il valore booleano:

package main

import "fmt"

func main() {
    fmt.Println(!true)  // false
    fmt.Println(!false) // true

    connesso := true
    disconnesso := !connesso
    fmt.Println("Disconnesso:", disconnesso) // false
}

Utilizzo nelle condizioni

I booleani sono il tipo fondamentale per le istruzioni condizionali in Go:

Istruzioni if

package main

import "fmt"

func main() {
    temperatura := 35

    caldo := temperatura > 30
    if caldo {
        fmt.Println("Fa molto caldo!")
    }

    // Espressione booleana diretta nell'if
    if temperatura > 25 && temperatura <= 30 {
        fmt.Println("Temperatura piacevole")
    } else if temperatura > 30 {
        fmt.Println("Troppo caldo")
    } else {
        fmt.Println("Fa fresco")
    }
}

Cicli con condizioni booleane

package main

import "fmt"

func main() {
    contatore := 0
    continua := true

    for continua {
        contatore++
        fmt.Printf("Iterazione %d\n", contatore)

        if contatore >= 5 {
            continua = false
        }
    }

    fmt.Println("Ciclo terminato dopo", contatore, "iterazioni")
}

Risultati di confronto

Gli operatori di confronto restituiscono sempre un valore booleano:

package main

import "fmt"

func main() {
    a, b := 10, 20

    fmt.Println(a == b)  // false
    fmt.Println(a != b)  // true
    fmt.Println(a < b)   // true
    fmt.Println(a > b)   // false
    fmt.Println(a <= b)  // true
    fmt.Println(a >= b)  // false

    // I risultati sono valori bool
    risultato := a < b
    fmt.Printf("Tipo: %T, Valore: %v\n", risultato, risultato)
    // Tipo: bool, Valore: true
}

Booleani come parametri e valori di ritorno

I booleani sono comunemente usati come parametri e valori di ritorno delle funzioni:

package main

import "fmt"

func ePari(n int) bool {
    return n%2 == 0
}

func eNellIntervallo(valore, minimo, massimo int) bool {
    return valore >= minimo && valore <= massimo
}

func valida(nome string) (bool, string) {
    if len(nome) == 0 {
        return false, "il nome non puo essere vuoto"
    }
    if len(nome) > 50 {
        return false, "il nome e troppo lungo"
    }
    return true, ""
}

func main() {
    fmt.Println(ePari(4))   // true
    fmt.Println(ePari(7))   // false

    fmt.Println(eNellIntervallo(25, 18, 65)) // true
    fmt.Println(eNellIntervallo(10, 18, 65)) // false

    valido, messaggio := valida("Mario")
    if valido {
        fmt.Println("Nome valido")
    } else {
        fmt.Println("Errore:", messaggio)
    }
}

Pattern comuni con i booleani

Flag di stato

package main

import "fmt"

type Server struct {
    Nome     string
    Attivo   bool
    InPausa  bool
}

func (s *Server) Stato() string {
    if !s.Attivo {
        return "spento"
    }
    if s.InPausa {
        return "in pausa"
    }
    return "in esecuzione"
}

func main() {
    server := Server{Nome: "web-01", Attivo: true, InPausa: false}
    fmt.Printf("%s: %s\n", server.Nome, server.Stato())

    server.InPausa = true
    fmt.Printf("%s: %s\n", server.Nome, server.Stato())
}

Idioma comma-ok

Un pattern molto comune in Go e l’idioma “comma-ok”, dove il secondo valore di ritorno e un booleano che indica il successo dell’operazione:

package main

import "fmt"

func main() {
    capitali := map[string]string{
        "Italia": "Roma",
        "Francia": "Parigi",
    }

    // L'idioma comma-ok per verificare l'esistenza
    capitale, ok := capitali["Italia"]
    if ok {
        fmt.Println("Trovato:", capitale) // Trovato: Roma
    }

    capitale, ok = capitali["Giappone"]
    if !ok {
        fmt.Println("Non trovato") // Non trovato
    }
}

Conclusione

Il tipo bool in Go e semplice ma essenziale. Con i suoi due valori (true e false), il valore zero false e i tre operatori logici (&&, ||, !), i booleani controllano il flusso di esecuzione dei programmi Go. L’idioma “comma-ok” e i pattern con flag di stato mostrano come i booleani vengano utilizzati idiomaticamente nella programmazione Go quotidiana.