Back to questions
Junior
764
questionbank
Какой концепт реализуется с помощью конструкции defer в языке Go?
Sobes Copilot
Get answers in real time
Answer from AI
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
}