Выбор ответа Middle Ошибки, defer, panic и recover спрашивают часто обновлено
recover и паника в другой горутине
Вопрос
В main стоит defer func() { recover() }(), а panic происходит в горутине, запущенной из main. Что будет?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Программа упадёт: recover ловит панику только своей горутины. Паника разматывает стек только той горутины, где произошла, и выполняет только её defer.
Варианты ответа
- recover в main перехватит панику, программа продолжит работу
- Горутина молча завершится, а main продолжит работу
- Паника будет отложена до выхода из main и тогда снята
- Программа упадёт: recover ловит панику только своей горутиныправильный ответ
Разбор
Паника разматывает стек только той горутины, где произошла, и выполняет только её defer. Если в этой горутине нет recover, процесс завершается целиком, независимо от recover в других горутинах. Поэтому в каждой горутине, где возможна паника (воркеры, обработчики), нужен свой defer с recover. Горутины не умирают молча, и паника не откладывается.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.