defer, panic и recover: аккуратная уборка
defer откладывает вызов до момента выхода из функции. Идеально для закрытия файлов, разблокировки мьютексов и прочей уборки — код освобождения стоит рядом с кодом захвата.
mu.Lock()
defer mu.Unlock()
// ... работаем с общими данными,
// Unlock вызовется в любом случаеПорядок LIFO
Несколько defer выполняются в обратном порядке — последний объявленный сработает первым. Это логично: ресурсы освобождаются в порядке, обратном захвату.
recover — только на границе
Ловить панику через recover имеет смысл на верхнем уровне — например, в обработчике HTTP, чтобы одна паника не уронила весь сервер. Использовать панику как обычный поток управления не стоит.