Das Aufschieben des GZIP Writer-Schließens führt zu Datenverlust
In Go kann die Verwendung von „Defer“ zum Schließen eines gzip.Writer zu unerwarteten EOF-Fehlern führen, wenn Auslesen der gezippten Daten. Um dieses Problem zu lösen, wollen wir uns mit den Einzelheiten des Problems befassen und eine alternative Lösung anbieten.
Das Problem verstehen:
Die Close-Methode von gzip.Writer führt zwei Aufgaben aus : Es überträgt alle ungeschriebenen Daten an den zugrunde liegenden Writer und schreibt die GZIP-Fußzeile. Allerdings im bereitgestellten Code:
func zipData(originData []byte) ([]byte, error) {
// ...
defer gw.Close()
// ...
}
Die Defer-Anweisung verzögert die Ausführung von gw.Close(), bis die umgebende Funktion zipData zurückkehrt. Wenn zipData beendet ist und zurückkehrt, wird die Fußzeile daher in einen nicht gespeicherten Puffer geschrieben und nicht im zurückgegebenen Byte-Array enthalten. Dies führt zu unerwarteten EOF-Fehlern, wenn versucht wird, aus den komprimierten Daten zu lesen.
Alternative Lösung:
Um das Problem zu beheben, wird empfohlen, den Writer zu schließen, bevor Sie die Datei zurücksenden komprimierte Daten:
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()
// ...
}
Durch das explizite Schließen des Writers vor der Rückkehr stellen Sie sicher, dass der GZIP-Footer in den gespeicherten Puffer geschrieben und somit im zurückgegebenen Byte-Array enthalten ist. Dies verhindert unerwartete EOF-Fehler und garantiert die Integrität der gezippten Daten.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3