Назад к вопросам
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
}