Go by Example: Channels

Los Channels son las tuberías que conectan goroutines concurrentes. Puedes enviar valores a los canales desde una goroutine y recibir esos valores en otra goroutine.

package main
import "fmt"
func main() {

Crea un nuevo canal con make(chan val-type). Los canales se tipifican por los valores que transmiten.

    messages := make(chan string)

Envía un valor a un canal usando la sintaxis canal <-. Aquí enviamos "ping" al messages

    go func() { messages <- "ping" }()

La sintaxis <-canal recibe un valor del canal. Aquí recibiremos el mensaje "ping" que enviamos arriba y lo imprimiremos.

    msg := <-messages
    fmt.Println(msg)
}

Cuando ejecutamos el programa, el mensaje "ping" se pasa con éxito de una goroutine a otra a través de nuestro canal.

$ go run channels.go 
ping

Por defecto, los envíos y recepciones se bloquean hasta que tanto el emisor como el receptor estén listos. Esta propiedad nos permitió esperar al final de nuestro programa por el mensaje "ping" sin tener que usar ninguna otra sincronización.

Siguiente ejemplo: Channel Buffering.