Отсрочка закрытия GZIP Writer приводит к потере данных.
В Go использование defer для закрытия gzip.Writer может привести к непредвиденным ошибкам EOF при чтение из заархивированных данных. Чтобы решить эту проблему, давайте углубимся в особенности проблемы и предложим альтернативное решение.
Понимание проблемы:
Метод Close gzip.Writer выполняет две задачи : он сбрасывает все незаписанные данные в базовый модуль записи и записывает нижний колонтитул GZIP. Однако в предоставленном коде:
func zipData(originData []byte) ([]byte, error) {
// ...
defer gw.Close()
// ...
}
Инструкция defer задерживает выполнение gw.Close() до тех пор, пока не вернется окружающая функция zipData. Поэтому, когда zipData завершает работу и возвращается, нижний колонтитул записывается в несохраненный буфер и не включается в возвращаемый массив байтов. Это приводит к непредвиденным ошибкам EOF при попытке чтения из заархивированных данных.
Альтернативное решение:
Чтобы решить проблему, рекомендуется закрыть средство записи перед возвратом архива. сжатые данные:
func zipData(originData []byte) ([]byte, error) {
// ...
if _, err := gw.Write(originData); err != nil {
return nil, err
}
if err := gw.Flush(); err != nil {
return nil, err
}
gw.Close()
// ...
}
Явно закрыв средство записи перед возвратом, вы гарантируете, что нижний колонтитул GZIP будет записан в сохраненный буфер и, таким образом, включен в возвращаемый массив байтов. Это предотвращает непредвиденные ошибки EOF и гарантирует целостность заархивированных данных.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3