Каналы в Go - это средство синхронизации горутин и передачи данных между ними. Они основаны на парадигме CSP (Communicating Sequential Processes).
Ключевые особенности:
<-chan) и приема (chan<-) на канале блокируются до тех пор, пока не будет соответствующая операция от другой горутины.Внутреннее устройство (на нижнем уровне):
Канал представляется структурой hchan в среде выполнения Go, которая включает:
qcount: текущее количество элементов в буфере.dataqsiz: размер буфера (емкость канала).buf: указатель на кольцевой буфер для хранения данных.elemsize: размер одного элемента данных в буфере.elemtype: тип элементов данных.sendx: индекс следующего места для отправки в буфере.recvx: индекс следующего места для приема в буфере.recvq: очередь горутин, ожидающих приема.sendq: очередь горутин, ожидающих отправки.lock: мьютекс для защиты структуры канала от одновременного доступа нескольких горутин.Операции с каналами:
Отправка: channel <- value
Прием: value := <-channel или value, ok := <-channel
Типы каналов:
make(chan int)make(chan int, 10) (емкость 10)Закрытие канала:
Функция close(ch) используется для сигнализации, что данных больше не будет отправляться. Попытка отправить в закрытый канал вызовет панику. Получение из закрытого канала вернет нулевое значение типа и ok будет false.
go
go
go