6 вопросов
Механизмы управления потоком выполнения: defer откладывает вызов до конца функции, panic вызывает аварийное завершение, recover перехватывает панику. Порядок выполнения defer - LIFO.
defer? 🟢 Лёгкий
▶
defer f() регистрирует вызов функции, который выполнится при выходе из текущей функции (return, panic). Часто используется для освобождения ресурсов: defer file.Close(), defer mu.Unlock().
Подробнее →Defer'ы складываются в стек (LIFO). Последний зарегистрированный выполняется первым. Это логично: ресурсы освобождаются в порядке, обратном получению.
Подробнее →Аргументы defer f(x) вычисляются немедленно, а вызов откладывается. Частая ловушка: defer fmt.Println(i) зафиксирует текущее значение i, даже если оно потом изменится. Используйте замыкание для актуального значения.
Подробнее →recover()? 🟡 Средний
▶
recover() останавливает распространение паники и возвращает значение, переданное в panic(). Работает только внутри defer-функции. Если паники нет, возвращает nil.
Подробнее →recover()? 🟡 Средний
▶
recover() имеет эффект только внутри отложенной (deferred) функции. Вызов recover() в обычном коде всегда возвращает nil. Типичный паттерн: defer func() { if r := recover(); r != nil { log.Println(r) } }().
Подробнее →Каждая горутина имеет свой стек вызовов. recover() работает только в той горутине, где произошла panic. Неперехваченная паника в горутине завершает всю программу.
Подробнее →