🟡 Средний · 2 очк. defer, panic, recover
Что не так с for _, f := range files { r, _ := os.Open(f); defer r.Close() }?
A Код корректен
B Файлы закроются только при выходе из функции, а не на каждой итерации
C defer не работает в цикле
D Ошибка компиляции
Объяснение вопроса

defer привязан к функции, а не к итерации цикла. Все вызовы defer r.Close() накопятся и выполнятся только при выходе из функции. Файлы останутся открытыми до конца функции.

Чем плохо

При большом количестве файлов - исчерпание файловых дескрипторов (limit open files). Ресурсы освободятся поздно и все сразу.

// Плохо:
for _, f := range files {
    r, _ := os.Open(f)
    defer r.Close()
    // ...
}

// Правильно: закрывать в конце итерации
for _, f := range files {
    r, err := os.Open(f)
    if err != nil { return err }
    // работа с r
    r.Close()
}
// Или вынести итерацию в отдельную функцию - тогда defer сработает при выходе из неё

Паттерн с отдельной функцией

Если нужен именно defer (например, при панике), оберните тело цикла в функцию: при выходе из неё все отложенные вызовы этой функции выполнятся.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.