Канал создаётся через make:
ch := make(chan int) // небуферизованный
ch := make(chan int, 10) // буферизованный на 10 элементов
Отправка: ch <- 42. Получение: val := <-ch.
Небуферизованный канал блокирует отправителя, пока получатель не прочитает (и наоборот) — это точка синхронизации.
Буферизованный блокирует только когда буфер полон (отправка) или пуст (получение).
ch := make(chan string, 1)
ch <- "hello" // не блокирует, буфер есть
msg := <-ch // "hello"
Закрытие: close(ch). После закрытия чтение возвращает zero value, запись — panic.