Go Em Exemplos: Channel Directions

Ao utilizar canais como parâmetros de funções, é possível especificar se o canal servirá apenas para enviar ou receber valores. Esta especificidade é uma boa prática pois aumenta a tipagem, ou type-safety do código.

package main
import "fmt"

Esta função ping apenas aceita um canal para enviar valores. Ao tentar receber valores neste canal, resultaria em erro de compilação.

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

Esta função pong aceita um canal para receber (pings) e um segundo canal 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

Próximo exemplo: Select.