Канал — это структура hchan с кольцевым буфером, мьютексом и двумя очередями ожидающих горутин (sendq/recvq).
Небуферизированный канал: отправитель блокируется, пока получатель не заберёт значение — данные копируются напрямую между стеками горутин. Буферизированный: данные кладутся в кольцевой буфер, блокировка только когда буфер полон (send) или пуст (receive).
Внутри используется runtime.gopark для парковки горутин и runtime.goready для пробуждения. Каждая операция send/receive защищена мьютексом канала.