Go в примерах: Буферизированный канал (Channel Buffering)

По умолчанию каналы не буферизованы, это означает, что они будут принимать отправления (chan <-), только если есть соответствующий прием (<- chan), готовый принять отправленное значение. Буферизованные каналы принимают ограниченное количество значений без соответствующего приемника для этих значений.

package main
import "fmt"
func main() {

Здесь мы создаем канал строк с буфером до 2 значений.

    messages := make(chan string, 2)

Т.к. этот канал буферизирован, мы можем послать значения в канал без соответствующего одновременного получения.

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

Позже мы можем получить эти значения как обычно.

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

Следующий пример: Синхронизация канала (Channel Synchronization).