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.