Go by Example: Channel Directions

Cuando se utilizan canales como parámetros de funciones, puedes especificar si un canal está destinado solo para enviar o recibir valores. Esta especificidad aumenta la seguridad de tipo del programa.

package main
import "fmt"

Esta función ping solo acepta un canal para enviar valores. Sería un error en tiempo de compilación intentar recibir en este canal.

func ping(pings chan<- string, msg string) {
    pings <- msg
}

La función pong acepta un canal para recibir (pings) y un segundo para enviar (pongs).

func pong(pings <-chan string, pongs chan<- string) {
    msg := <-pings
    pongs <- msg
}
func main() {
    pings := make(chan string, 1)
    pongs := make(chan string, 1)
    ping(pings, "passed message")
    pong(pings, pongs)
    fmt.Println(<-pongs)
}
$ go run channel-directions.go
passed message

Siguiente ejemplo: Select.