Назад к вопросам
Junior
671
questionbank
Какой концепт реализуется с помощью конструкции defer в языке Go?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Конструкция defer реализует концепт отложенного выполнения функции. Отложенная функция выполняется непосредственно перед завершением функции, содержащей defer.
Ключевые моменты:
- Время выполнения: Отложенная функция выполняется в самом конце родительской функции, даже если произошла паника или исключение.
- Стек: Отложенные вызовы образуют стек. Последний отложенный вызов будет выполнен первым (LIFO).
- Захват переменных: Аргументы отложенной функции вычисляются в момент объявления
defer, а не в момент выполнения.
Примеры типичного использования:
- Закрытие файлов, сетевых соединений, мьютексов.
- Восстановление состояния (например, после изменения глобальных переменных или флагов).
- Измерение времени выполнения.
// Пример использования defer для закрытия файла
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // Файл будет закрыт перед выходом из функции
// Чтение из файла...
return nil
}
// Пример стека defer-вызовов
func process() {
defer fmt.Println("Первым из стека")
defer fmt.Println("Вторым из стека")
defer fmt.Println("Третьим из стека") // Выполнится последним
fmt.Println("Обработка...")
}
Отложенные вызовы с аргументами:
// Пример захвата значения переменной в момент объявления defer
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("Значение i в defer:", i) // i будет 0
i++
fmt.Println("Значение i после инкремента:", i) // i будет 1
}