Sobes.tech
Назад к вопросам
Senior
3

Какие правила (аксиомы) работы с каналами существуют в Go?

Компании, где спрашивали
RedLab

Ответ от нейросети

sobes.tech AI

В Go каналы (channels) используются для коммуникации между горутинами и имеют несколько ключевых правил (аксиом):

  • Канал — это типизированная очередь, которая обеспечивает синхронизацию между отправителем и получателем.
  • Отправка в канал блокирует горутину, если буфер канала заполнен (для буферизированных каналов) или если нет получателя (для небуферизированных).
  • Приём из канала блокирует горутину, если канал пуст.
  • Закрытие канала (close(ch)) сигнализирует, что больше не будет отправок; при этом приём из закрытого канала возвращает нулевое значение и false во втором параметре.
  • Нельзя отправлять в закрытый канал — это приведёт к панике.
  • Каналы можно использовать для передачи данных и синхронизации, но не для хранения состояния.

Пример:

ch := make(chan int, 1) // буферизированный канал
ch <- 42                // отправка
val := <-ch             // приём

close(ch)               // закрытие канала
v, ok := <-ch           // ok == false, если канал закрыт и пуст

Эти правила обеспечивают безопасное и предсказуемое взаимодействие между горутинами через каналы.