В каких случаях defer не будет вызван?

defer не выполняется, если до него не дошли, функция не завершилась или процесс оборван без размотки стека, например через os.Exit. Обычная panic запускает отложенные вызовы.

Короткий ответ

Что ответить на собеседовании

defer не выполняется, если до него не дошли, функция не завершилась или процесс оборван без размотки стека, например через os.Exit. Обычная panic запускает отложенные вызовы.

Подробный разбор

Ответ с пояснениями

defer не выполняется, если до него не дошли, функция не завершилась или процесс оборван без размотки стека, например через os.Exit. Обычная panic запускает отложенные вызовы.

Отложенный вызов регистрируется только при выполнении оператора defer. Если функция навсегда заблокирована или находится в бесконечном цикле, до её выхода дело не доходит.

os.Exit немедленно завершает программу без defer; аналогично опасны принудительное завершение процесса и фатальные ошибки runtime. При обычной panic выполняются зарегистрированные defer в стеке паникующей горутины, в обратном порядке. Это не гарантирует выполнение defer других горутин: возврат из main завершает программу, не ожидая их окончания.

Источник: pkg.go.dev.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее