Adiar o fechamento do gravador GZIP leva à perda de dados
No Go, usar defer para fechar um gzip.Writer pode resultar em erros EOF inesperados quando lendo os dados compactados. Para resolver esse problema, vamos nos aprofundar nos detalhes do problema e fornecer uma solução alternativa.
Compreendendo o problema:
O método Close do gzip.Writer executa duas tarefas : libera todos os dados não gravados para o gravador subjacente e grava o rodapé GZIP. No entanto, no código fornecido:
func zipData(originData []byte) ([]byte, error) {
// ...
defer gw.Close()
// ...
}
A instrução defer atrasa a execução de gw.Close() até que a função circundante zipData retorne. Portanto, quando zipData termina e retorna, o rodapé é gravado em um buffer não salvo e não incluído na matriz de bytes retornada. Isso causa erros EOF inesperados ao tentar ler os dados compactados.
Solução alternativa:
Para resolver o problema, é recomendável fechar o gravador antes de retornar o dados compactados:
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()
// ...
}
Ao fechar explicitamente o gravador antes de retornar, você garante que o rodapé GZIP seja gravado no buffer salvo e, portanto, incluído na matriz de bytes retornada. Isso evita erros inesperados de EOF e garante a integridade dos dados compactados.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3