Загрузка…
Загрузка…
Go · junior · сложность 2
Небуферизованный канал (make(chan T)): Канал с емкостью буфера 0. Операция отправки по небуферизованному каналу блокируется до тех пор, пока получатель не будет готов принять значение. Операция приема блокируется до тех пор, пока отправитель не будет готов отправить значение. Это обеспечивает синхронную связь; и отправитель, и получатель должны быть готовы одновременно к осуществлению передачи.
Буферный канал (make(chan T, capacity)): Канал с емкостью буфера больше 0. Операция отправки блокируется только в том случае, если буфер заполнен. Операция приема блокируется только в том случае, если буфер пуст. Это позволяет осуществлять асинхронную связь вплоть до емкости буфера; отправитель может отправить значение и продолжить, не дожидаясь получателя, пока в буфере есть место.
Выбор:
Выбирайте небуферизованные каналы, когда вам нужно синхронизировать горутины или явно передать право собственности на данные. Они хороши для обеспечения того, чтобы операция была завершена получателем до того, как отправитель продолжит работу (например, сигнализация о завершении задачи).
Выбирайте буферизованные каналы, когда вам нужно в некоторой степени разъединить отправителя и получателя, позволяя отправителю опередить получателя. Они полезны для реализации очередей, ограничителей скорости или когда вы знаете, что у вас будут пакеты данных, которые получатель может быть не в состоянии обработать немедленно. Помните о размере буфера; слишком маленький может привести к блокировке, слишком большой может привести к чрезмерному использованию памяти.
make(chan T)): Канал с емкостью буфера 0.