Menangguhkan Penutupan Menyebabkan Kehilangan Data dalam Penulis gzip
Apabila menggunakan gzip.NewWriter dalam Go untuk memampatkan kepingan bait, biasanya diperhatikan bahawa menangguhkan penutupan penulis mengakibatkan kehilangan data. Fenomena ini menjadi jelas apabila membaca data yang dimampatkan, kerana ia ditamatkan secara pramatang dengan ralat akhir fail (EOF) yang tidak dijangka.
Untuk memahami perkara ini, mari kita periksa coretan kod yang disediakan:
<code class="go">func zipData(originData []byte) ([]byte, error) { // Create a buffer to store the compressed data var bf bytes.Buffer // Initialize the gzip writer with the buffer gw := gzip.NewWriter(&bf) // Defer closure of the writer defer gw.Close() // Write the original data to the writer _, err := gw.Write(originData) if err != nil { return nil, err } // Flush the writer to write any buffered data if err = gw.Flush(); err != nil { return nil, err } // Return the compressed data return bf.Bytes(), nil }</code>
Isu ini berpunca daripada penggunaan penangguhan untuk menutup penulis gzip (gw). Menurut dokumentasi untuk Close():
"Tutup menutup Penulis dengan membuang sebarang data tidak bertulis ke io.Penulis asas dan menulis pengaki GZIP."
Dalam kes ini, penangguhan penutupan dilaksanakan selepas fungsi mengembalikan data termampat yang disimpan dalam penimbal (bf). Walau bagaimanapun, pengaki tidak ditulis sehingga kaedah Close() digunakan, menjadikan data termampat tidak lengkap apabila ia dikembalikan.
Isu ini boleh diselesaikan dengan menutup penulis secara manual sebelum mengembalikan data termampat:
<code class="go">func zipData(originData []byte) ([]byte, error) { // ... (same code as before) ... // Close the writer to write the footer if err := gw.Close(); err != nil { return nil, err } // Return the compressed data return bf.Bytes(), nil }</code>
Dengan menutup penulis sebelum kembali, pengaki GZIP berjaya ditulis dan data yang dimampatkan boleh dibaca tanpa menghadapi ralat EOF.
Atas ialah kandungan terperinci Mengapa Menangguhkan Penutupan gzip.NewWriter Menyebabkan Kehilangan Data dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!