Зачем нужна конструкция defer?
Этот вопрос проверяет знание конструкции defer, используемой для отложенного выполнения кода.
Короткий ответ
defer позволяет отложить выполнение функции до завершения текущей функции. Это удобно для освобождения ресурсов, закрытия файлов или завершения транзакций.
Длинный ответ
defer используется для обеспечения выполнения операций, которые должны произойти в любом случае, даже если функция завершится с ошибкой. Например, закрытие файла или разблокировка ресурса.
Пример:
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Ошибка:", err)
return
}
defer file.Close() // Закрытие файла после выполнения функции
fmt.Println("Файл успешно открыт")
}
Особенности:
- Вызываемые функции defer выполняются в обратном порядке их объявления (LIFO).
- Отложенные функции исполняются даже при панике.
Пример использования нескольких defer:
package main
import "fmt"
func main() {
defer fmt.Println("Завершение 1")
defer fmt.Println("Завершение 2")
fmt.Println("Работа программы")
}Вывод:
Работа программы
Завершение 2
Завершение 1
В каких случаях использовать:
- Для освобождения системных ресурсов (файлы, соединения).
- Для отмены блокировок.
- Для логирования завершения работы функции.