====== Go Stdlib Wiki: package compress/gzip ====== ===== 1. Overview ===== compress/gzip provides gzip compression and decompression compatible with the gzip file format (RFC 1952). You typically use: gzip.Writer to compress (write compressed data) gzip.Reader to decompress (read compressed data) gzip /ˈdʒiːzɪp/ = định dạng nén gzip compress /kəmˈpres/ = nén decompress /ˌdiːkəmˈpres/ = giải nén compatible /kəmˈpætəbl/ = tương thích import "compress/gzip" ===== 2. What it is for ===== Use compress/gzip when you need to: Reduce size of text-like data (JSON, HTML, logs) for network transfer or storage Implement HTTP gzip responses (server-side) Read/write .gz files Compress streams (data piped through io.Reader/io.Writer) transfer /ˈtrænsfɝː/ = truyền tải storage /ˈstɔːrɪdʒ/ = lưu trữ stream /striːm/ = luồng dữ liệu ===== 3. Key types (what is what) ===== ==== 3.1 gzip.Writer ==== What it is: an io.WriteCloser that compresses anything written to it and forwards compressed bytes to an underlying io.Writer. What it is for: compressing data (writing gzip output). Important: Always call Close() to flush final bytes and write gzip footer. Optionally call Flush() for streaming scenarios. footer /ˈfʊtər/ = phần cuối (kết thúc format) flush /flʌʃ/ = xả/đẩy dữ liệu còn lại ra Create: gzip.NewWriter(w io.Writer) *gzip.Writer gzip.NewWriterLevel(w io.Writer, level int) (*gzip.Writer, error) Compression levels: gzip.NoCompression gzip.BestSpeed gzip.BestCompression gzip.DefaultCompression gzip.HuffmanOnly level /ˈlevəl/ = mức độ huffman /ˈhʌfmən/ = (thuật toán) Huffman ==== 3.2 gzip.Reader ==== What it is: an io.ReadCloser that reads compressed gzip data from an underlying io.Reader and outputs decompressed bytes. What it is for: decompressing data (reading original content). Create: gzip.NewReader(r io.Reader) (*gzip.Reader, error) Important: Call Close() when done. ===== 4. Most common patterns ===== ==== 4.1 Compress []byte -> gzip []byte ==== package main import ( "bytes" "compress/gzip" ) func GzipCompress(data []byte) ([]byte, error) { var buf bytes.Buffer zw := gzip.NewWriter(&buf) // create gzip.Writer if _, err := zw.Write(data); err != nil { _ = zw.Close() return nil, err } if err := zw.Close(); err != nil { // IMPORTANT: finalize gzip stream return nil, err } return buf.Bytes(), nil } Why Close() is required: Without Close(), the last chunk + gzip metadata may not be written. ==== 4.2 Decompress gzip []byte -> original []byte ==== package main import ( "bytes" "compress/gzip" "io" ) func GzipDecompress(gzData []byte) ([]byte, error) { zr, err := gzip.NewReader(bytes.NewReader(gzData)) if err != nil { return nil, err } defer zr.Close() return io.ReadAll(zr) } defer /dɪˈfɝː/ = hoãn lại (thường để đóng resource) ===== 5. Streaming use cases ===== ==== 5.1 Compress while writing to a destination ==== Example: compress data as you write to a file/network writer. zw := gzip.NewWriter(dstWriter) defer zw.Close() // write to zw, not dstWriter _, _ = zw.Write(chunk) ==== 5.2 Decompress while reading from a source ==== zr, _ := gzip.NewReader(srcReader) defer zr.Close() // read from zr to get decompressed bytes ===== 6. When NOT to use gzip ===== Already-compressed formats (JPEG/PNG/MP4/PDF) often won’t shrink much. Very small payloads may grow due to gzip headers. payload /ˈpeɪloʊd/ = dữ liệu chính (nội dung truyền) ===== 7. Quick “what is what for” map ===== gzip.Writer — write compressed bytes (nén) gzip.NewWriter(w) — create a compressor targeting w gzip.NewWriterLevel(w, level) — choose compression level gzip.Reader — read decompressed bytes (giải nén) gzip.NewReader(r) — create a decompressor reading from r Close() — finalize/flush gzip stream (bắt buộc khi nén)