Skip to content

Instantly share code, notes, and snippets.

@invidian
Created November 11, 2021 12:22
Show Gist options
  • Save invidian/79a1728a025e4ea6a33ee7df7492de04 to your computer and use it in GitHub Desktop.
Save invidian/79a1728a025e4ea6a33ee7df7492de04 to your computer and use it in GitHub Desktop.
Golang stream gzip compression and decompression
package main
import (
"compress/gzip"
"io"
"log"
"os"
)
func main() {
compressedReader, compressedWriter := io.Pipe()
// Compressed data will be written to pipe.
compressorWriter := gzip.NewWriter(compressedWriter)
inputReader := os.Stdin
go func() {
// Initialize compression by draining input.
if _, err := io.Copy(compressorWriter, inputReader); err != nil {
log.Fatal(err)
}
// Ensure all data was flushed.
if err := compressorWriter.Close(); err != nil {
log.Fatal(err)
}
// Close writing to pipe, so reading from it does not block infinitely.
if err := compressedWriter.Close(); err != nil {
log.Fatal(err)
}
}()
// Start decompressing using data from pipe.
decompressorReader, err := gzip.NewReader(compressedReader)
if err != nil {
log.Fatal(err)
}
outputWriter := os.Stdout
// Finally, copy output into stdout.
if _, err := io.Copy(outputWriter, decompressorReader); err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment