Channel
#
// I _channel_ sono i <a href="https://it.wikipedia.org/wiki/Pipe_(informatica)">pipe</a>
// che connettono goroutine concorrenti. Puoi mandare
// e ricevere dei valori da una goroutine a un'altra
// goroutine attraverso un channel.
package main
import "fmt"
func main() {
// Puoi creare un nuovo channel con la sintassi
// `make(chan tipo)`. I channel sono dichiarati con i
// tipi dei valori che possono veicolare.
messages := make(chan string)
// Puoi _inviare_ un valore in un channel con la
// sintassi `channel <-`. Di seguito mandiamo la
// stringa `"ping"` al channel `messages` che abbiamo
// dichiarato in precedenza, in una nuova goroutine.
go func() { messages <- "ping" }()
// Puoi _ricevere_ un valore da un channel con la
// sintassi `<-channel`. Di seguito riceveremo il
// messaggio `"ping"` che abbiamo inviato a messages
// precedentemente nella goroutine e lo stamperemo.
msg := <-messages
fmt.Println(msg)
}
# Quando eseguiremo il programma potremmo vedere che
# `"ping"` è passato senza problemi da una goroutine
# all'altra attraverso il nostro channel.
$ go run channels.go
ping
# Di default l'invio e il ricevimento si bloccano finché
# sia il mittente che il destinatario non sono pronti.
# Questo ci ha permesso di aspettare alla fine del
# programma per il messaggio `"ping"` senza dover
# effetturare alcuna sincronizzazione.