Выбор ответа Middle Каналы и select спрашивают часто обновлено
Кто закрывает канал при нескольких отправителях
Вопрос
Три горутины-производителя пишут в общий канал out, потребитель читает for v := range out. Как правильно закрыть out?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Отдельная горутина ждёт WaitGroup производителей и закрывает out. Закрыть можно только один раз и только когда никто больше не отправит.
Варианты ответа
- Отдельная горутина ждёт WaitGroup производителей и закрывает outправильный ответ
- Каждый производитель закрывает out, когда закончил свою отправку
- Потребитель закрывает out, когда прочитал достаточно значений
- Не закрывать: range завершится сам, когда данные кончатся
Разбор
Закрыть можно только один раз и только когда никто больше не отправит. Если закроет каждый производитель, второй close вызовет панику, а отправка после первого close тоже паникует. Потребитель не знает, закончили ли производители. Без close range зависнет навсегда после последнего значения. Отсюда шаблон: go func() { wg.Wait(); close(out) }().
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.