for _, f := range files { r, _ := os.Open(f); defer r.Close() }?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 (например, при панике), оберните тело цикла в функцию: при выходе из неё все отложенные вызовы этой функции выполнятся.