Go by Example - IT: Operazioni Su Channel Non Bloccanti

Le operazioni di invio e di ricezione nei channel sono bloccanti. Tuttavia, possiamo usare un select con una clausola per implementare invii, ricezioni e select a più clausole non bloccanti.

package main
import "fmt"
func main() {
    messaggi := make(chan string)
    segnali := make(chan bool)

Di seguito una ricezione non bloccante. Se un valore è disponibile su messages, allora select userà il case apposito. Se nessun valore è disponibile, allora selezionerà immediatamente il branch default.

    select {
    case msg := <-messaggi:
        fmt.Println("messaggio ricevuto", msg)
    default:
        fmt.Println("nessun messaggio ricevuto")
    }

Un invio non bloccante funziona più o meno alla stessa maniera.

    msg := "ciao"
    select {
    case messaggi <- msg:
        fmt.Println("messaggio inviato", msg)
    default:
        fmt.Println("nessun messaggio inviato")
    }

Possiamo usare case multipli sopra la clausola default per implementare un select a più clausole non bloccanti. Qui facciamo una ricezione non-bloccante sia su messaggi che su segnali.

    select {
    case msg := <-messaggi:
        fmt.Println("messaggio ricevuto", msg)
    case sig := <-segnali:
        fmt.Println("segnale ricevuto", sig)
    default:
        fmt.Println("nessuna attività")
    }
}
$ go run non-blocking-channel-operations.go 
nessun messaggio ricevuto
nessun messaggio inviato
nessuna attività

Prossimo esempio: Chiudere Channel.