// When using channels as function parameters, you can // specify if a channel is meant to only send or receive // values. This specificity increases the type-safety of // the program. package main import "fmt" // This `ping` function only accepts a channel for sending // values. It would be a compile-time error to try to // receive on this channel. func ping(pings chan<- string, msg string) { pings <- msg } // The `pong` function accepts one channel for receives // (`pings`) and a second for sends (`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) }