延遲 GZIP Writer 關閉可能會導致資料遺失
GZIP Writer 是 Go 中用於資料壓縮的常用實用程式。該編寫器有一個 Close 方法,它不僅刷新數據,還寫入成功解壓縮所需的 GZIP 頁腳。
在某些情況下,很容易推遲 Close 呼叫以確保它在結束時執行一個函數。但是,這種方法可能會導致資料遺失。
要了解原因,請考慮以下程式碼:
<code class="go">func main() { data := []byte("Hello World") compressedData, err := zipData(data) if err != nil { panic(err) } uncompressedData, err := unzipData(compressedData) if err != nil { panic(err) } fmt.Println(string(uncompressedData)) }</code>
zipData 函數使用GZIP 編寫器,unzipData 函數讀取壓縮資料:
<code class="go">func zipData(data []byte) ([]byte, error) { buf := new(bytes.Buffer) gw := gzip.NewWriter(buf) // Deferring Close here causes data loss! defer gw.Close() _, err := gw.Write(data) if err != nil { return nil, err } err = gw.Flush() if err != nil { return nil, err } return buf.Bytes(), nil }</code>
<code class="go">func unzipData(data []byte) ([]byte, error) { r := bytes.NewReader(data) gr, err := gzip.NewReader(r) if err != nil { return nil, err } defer gr.Close() uncompressed, err := ioutil.ReadAll(gr) if err != nil { return nil, err } return uncompressed, nil }</code>
<code class="go">func zipData(data []byte) ([]byte, error) { buf := new(bytes.Buffer) gw := gzip.NewWriter(buf) // Close the writer before returning defer gw.Close() _, err := gw.Write(data) if err != nil { return nil, err } err = gw.Flush() if err != nil { return nil, err } return buf.Bytes(), nil }</code>
以上是## 為什麼延遲 GZIP Writer 關閉會導致 Go 中的資料遺失?的詳細內容。更多資訊請關注PHP中文網其他相關文章!