> Когда можно закрыть канал при нескольких писателях и читателях в Go? (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Канал в Go можно безопасно закрыть только тогда, когда гарантированно ни один писатель не будет отправлять в него данные. При нескольких писателях и читателях закрытие канала одним из писателей или читателей может привести к панике (send on closed channel).

Правильные подходы:

  1. Использовать sync.WaitGroup для синхронизации писателей: закрывать канал только после того, как все писатели завершили отправку. Например, все писатели вызывают wg.Done(), а отдельная горутина (или последний писатель) закрывает канал после wg.Wait().

  2. Использовать сигнальный канал для завершения: вместо закрытия основного канала, передавать читателям отдельный канал завершения (done), который закрывается, когда нужно остановить чтение. Читатели выходят из цикла по этому сигналу, а писатели сами прекращают отправку (например, через select с done).

  3. Использовать контекст (context.Context): отменять контекст, чтобы все горутины (и писатели, и читатели) завершились, не закрывая основной канал.

Важно: закрытие канала - это действие писателя. Читатель никогда не должен закрывать канал, если есть активные писатели. Если писателей несколько, закрытие должен выполнять только один из них (или отдельная горутина), и только после того, как все писатели закончили отправку.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью