Go by Example: Channel Buffering

Por defecto, los canales son sin buffer, lo que significa que solo aceptarán envíos (chan <-) si hay una recepción correspondiente (<- chan) lista para recibir el valor enviado. Los canales con buffer aceptan un número limitado de valores sin un receptor correspondiente para esos valores.

package main
import "fmt"
func main() {

Aquí hacemos un canal de cadenas con un buffer de hasta 2 valores.

    messages := make(chan string, 2)

Debido a que este canal está bufferizado, podemos enviar estos valores al canal sin una recepción concurrente correspondiente.

    messages <- "buffered"
    messages <- "channel"

Más tarde podemos recibir estos dos valores como de costumbre.

    fmt.Println(<-messages)
    fmt.Println(<-messages)
}
$ go run channel-buffering.go 
buffered
channel

Siguiente ejemplo: Channel Synchronization.