Direzione
Conviene sempre che le funzioni che prendono channel come parametri indichino se il channel è gestito in sola lettura o solo scrittura.
Questo evita la situazione pericolosa di lettura e scrittura sullo stesso channel - il compilatore se ne accorge.
Esempio
(260channel-directions.go):
package main
import "fmt"
// Funzione che accetta un channel solo per invio
// I parametri formali hanno un nome indipendente
// dai parametri attuali
func ping(in chan<- string, msg string) {
in <- msg
}
// Funzione che accetta un channel solo in ricezione
// e un secondo channel solo in invio
func pong(in <-chan string, out chan<- string) {
// attende un ping
msg := <-in
// invia subito un pong
out <- msg
}
func main() {
// I channel devono essere bufferizzati
pings := make(chan string, 1)
pongs := make(chan string, 1)
go pong(pings, pongs)
go ping(pings, "passed message")
// Se si arriva qui il messaggio è tornato
fmt.Println(<-pongs)
}
ping
riceve una stringa dal main sul cahannel di input.
pong
legge dal channel di input e invial il dato al channel di output
Il main poi legge dal channel di output.
Notare che i nomi attuali dei channel sono diversi nel main dai nomi formali dei parametri delle funzioni. In generale le funzioni potrebbero trovarsi in un altro package e il main non avrebbe idea del nome dei channel in tali funzioni.
Le due funzioni potrebbero essere anche in package diversi e avere nomi dei parametri formali diversi.
In questo programma tutto avviene in un'unica routine, il main. Non è una buona idea.
I channel servono a comunicare tra goroutines diverse, o tra loro e il main. Nel mondo reale e non didattico, la comunicazione tramite channel di una routine con se stessa è un invito a problemi.