> Как избежать утечек памяти при работе с файлами в цикле в Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Лига Цифровой Экономики

Стек: Go

> Пример ответа

Основная проблема утечек памяти при работе с файлами в цикле в Go - это забывание закрыть файл после обработки, особенно при возникновении ошибок. Для избежания этого используйте defer внутри цикла, но с осторожностью: defer выполняется при выходе из функции, а не из итерации цикла, что может привести к накоплению открытых файлов до завершения всей функции.

Правильный подход - обернуть каждую итерацию в отдельную функцию или использовать defer внутри блока, который гарантированно завершается. Пример:

GO
func processFiles(files []string) error {
for _, file := range files {
if err := processFile(file); err != nil {
return err
}
}
return nil
}
func processFile(path string) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close() // закрытие гарантировано при выходе из processFile
// работа с файлом
return nil
}

Если вы не хотите выносить логику в отдельную функцию, используйте анонимную функцию внутри цикла:

GO
for _, file := range files {
func() {
f, err := os.Open(file)
if err != nil {
log.Printf("error: %v", err)
return
}
defer f.Close()
// обработка
}()
}

Также важно проверять ошибки при закрытии файла (например, при записи буферизированных данных), но для чтения это менее критично. Используйте io.Copy или bufio с последующей проверкой ошибок Close().

Дополнительно: избегайте хранения больших объёмов данных из файлов в памяти без необходимости - обрабатывайте их потоково. Если файлы очень большие, используйте io.Reader и читайте частями.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью