При работе с
bufio.Writer данные сначала попадают в буфер. Ошибка может возникнуть при Flush() или закрытии файла - уже после успешного Write().Сохранить все ошибки можно через именованный результат и
errors.Join:
func save(path string, data []byte) (err error) {
f, err := os.Create(path)
if err != nil {
return err
}
w := bufio.NewWriter(f)
defer func() {
flushErr := w.Flush()
closeErr := f.Close()
err = errors.Join(err, flushErr, closeErr)
}()
_, err = w.Write(data)
return err
}
Нужны пакеты
bufio, errors и os.Что здесь важно:
* сначала выполняется
Flush(), затем Close()* файл закрывается даже при ошибке сброса буфера
* именованный
err позволяет изменить результат после return, пока выполняется defer*
errors.Join сохраняет все ошибки; errors.Is и errors.As умеют их проверять* если ошибок нет, результат остаётся
nilЛовушка:
defer errors.Join(err, f.Close()) закроет файл сразу - аргументы отложенного вызова вычисляются при регистрации defer.Приём работает в актуальном Go и доступен с Go 1.20.
Flush() передаёт данные нижележащему writer; для синхронизации файла с хранилищем нужен отдельный f.Sync().errors.Join - https://pkg.go.dev/errors#Join
os.File - https://pkg.go.dev/os#File.Sync