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à