В Go существуют два основных типа каналов:
-
Небуферизованные (unbuffered):
- Создаются без указания размера буфера:
make(chan int).
- Операция отправки блокируется до тех пор, пока другая горутина не выполнит операцию получения.
- Операция получения блокируется до тех пор, пока другая горутина не выполнит операцию отправки.
- Обеспечивают синхронизацию между горутинами.
-
Буферизованные (buffered):
- Создаются с указанием размера буфера:
make(chan int, 10).
- Операция отправки блокируется только в том случае, если буфер заполнен.
- Операция получения блокируется только в том случае, если буфер пуст.
- Позволяют асинхронно отправлять и получать данные, пока есть свободное место в буфере.
Также можно рассматривать каналы с точки зрения направления:
- Двунаправленные (bi-directional): Каналы, которые по умолчанию создаются с возможностью как отправки, так и получения данных.
- Однонаправленные (directional): Каналы, которые явно объявляются либо только для отправки (
chan<- T), либо только для получения (<-chan T). Это помогает усилить типобезопасность и明确意图 (уточнить намерение) в сигнатурах функций.
go