Проверяет понимание работы defer, управления памятью и влияния на производительность.
defer внутри цикла накапливает отложенные вызовы и выполняет их только при выходе из функции. В больших циклах это приводит к росту памяти и задержке освобождения ресурсов.
defer в Go добавляет функцию в стек отложенных вызовов, который выполняется только при возврате из текущей функции, а не при завершении итерации цикла.
Если написать так:
for i := 0; i < 100000; i++ {
defer f.Close()
}произойдёт следующее:
все 100 000 defer будут сохранены в памяти;
f.Close() выполнится один раз - в самом конце функции;
ресурсы (файлы, соединения) будут удерживаться слишком долго.
Почему это плохо:
Рост памяти - каждый defer хранит ссылку и аргументы.
Задержка освобождения ресурсов — файлы, mutex, соединения.
Падение производительности — особенно в горячих путях.
Как правильно:
выносить defer в отдельную функцию;
или вызывать Close() явно в конце итерации.
for _, f := range files {
func() {
defer f.Close()
process(f)
}()
}Вывод: defer внутри больших циклов — частая причина скрытых проблем с памятью и ресурсами.