Le report de la fermeture de GZIP Writer entraîne une perte de données
Dans Go, l'utilisation de defer pour fermer un gzip.Writer peut entraîner des erreurs EOF inattendues lorsque lecture à partir des données compressées. Pour résoudre ce problème, examinons les détails du problème et proposons une solution alternative.
Comprendre le problème :
La méthode Close de gzip.Writer effectue deux tâches : il vide toutes les données non écrites vers l'enregistreur sous-jacent et écrit le pied de page GZIP. Cependant, dans le code fourni :
<code class="go">func zipData(originData []byte) ([]byte, error) { // ... defer gw.Close() // ... }</code>
L'instruction defer retarde l'exécution de gw.Close() jusqu'au retour de la fonction environnante zipData. Par conséquent, lorsque zipData se termine et revient, le pied de page est écrit dans un tampon non enregistré et n'est pas inclus dans le tableau d'octets renvoyé. Cela provoque des erreurs EOF inattendues lors de la tentative de lecture à partir des données compressées.
Solution alternative :
Pour résoudre le problème, il est recommandé de fermer l'enregistreur avant de renvoyer le données compressées :
<code class="go">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() // ... }</code>
En fermant explicitement le rédacteur avant de revenir, vous vous assurez que le pied de page GZIP est écrit dans le tampon enregistré et donc inclus dans le tableau d'octets renvoyé. Cela évite les erreurs EOF inattendues et garantit l'intégrité des données compressées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!