Deferring GZIP Writer Closure Results in Data Loss
Background:
When working with gzip, utilizing gzip.NewWriter to compress data and deferring Close() to close the writer can lead to a loss of compressed data.
Issue:
Deferring the closure of the GZIP writer causes the missing of the GZIP footer. As specified in the Close function documentation:
Close closes the Writer by flushing any unwritten data to the underlying io.Writer and writing the GZIP footer. It does not close the underlying io.Writer.
Solution:
To prevent data loss, close the GZIP writer before returning the compressed data:
<code class="go">func zipData(originData []byte) ([]byte, error) { var bf bytes.Buffer gw := gzip.NewWriter(&bf) _, err := gw.Write(originData) if err != nil { return nil, errors.New(fmt.Sprintf("gzip data err: %v", err)) } err = gw.Flush() if err != nil { return nil, err } if err := gw.Close(); err != nil { return nil, errors.New(fmt.Sprintf("close data err: %v", err)) } return bf.Bytes(), nil }</code>
The above is the detailed content of Why Does Deferring GZIP Writer Closure Lead to Data Loss?. For more information, please follow other related articles on the PHP Chinese website!