gzip
compress/gzipパッケージは、gzip形式のデータの圧縮と解凍を行うための機能を提供する
gzip形式は、広く使われている圧縮フォーマットで、ファイルの圧縮やHTTP通信におけるデータの圧縮などで利用される
利用用途
ファイルの圧縮と解凍
ローカルファイルをgzip形式で圧縮または解凍
.gz拡張子のファイルの生成や展開に使用
HTTP通信の圧縮
net/httpパッケージと組み合わせて、HTTPサーバーやクライアントでgzip圧縮 レスポンスデータをgzip圧縮して、帯域幅を節約
データストリームの圧縮と解凍
メモリ上でのデータの圧縮・解凍
ネットワーク通信でのリアルタイムなデータ圧縮
サンプルコード
ファイルの圧縮
code:sample.go
package main
import (
"compress/gzip"
"fmt"
"io"
"os"
)
func main() {
// 圧縮対象のファイルを開く
inputFile, err := os.Open("example.txt")
if err != nil {
fmt.Println("入力ファイルを開けませんでした:", err)
return
}
defer inputFile.Close()
// 圧縮後のファイルを作成(.gz拡張子)
outputFile, err := os.Create("example.txt.gz")
if err != nil {
fmt.Println("出力ファイルを作成できませんでした:", err)
return
}
defer outputFile.Close()
// gzipライターを作成
writer := gzip.NewWriter(outputFile)
defer writer.Close()
// 圧縮レベルを設定(デフォルトはgzip.DefaultCompression)
writer, err := gzip.NewWriterLevel(outputFile, gzip.BestCompression)
// 元のファイル名をヘッダーに設定(オプション)。解凍時にファイル名として使用される
writer.Name = "example.txt"
// データをコピーしながら圧縮
_, err = io.Copy(writer, inputFile)
if err != nil {
fmt.Println("データの圧縮中にエラーが発生しました:", err)
return
}
fmt.Println("ファイルの圧縮が完了しました。")
}
HTTPハンドラでのgzip圧縮
code:sample.go
package main
import (
"compress/gzip"
"fmt"
"io"
"net/http"
"strings"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// クライアントがgzipを受け入れるか確認
if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
// ヘッダーを設定
w.Header().Set("Content-Encoding", "gzip")
// gzipライターを作成
gz := gzip.NewWriter(w)
defer gz.Close()
// ライターを変更
w = gzipResponseWriter{Writer: gz, ResponseWriter: w}
}
// レスポンスを書き込み
fmt.Fprintln(w, "Hello, Gopher!")
})
fmt.Println("サーバーを開始します。ポート8080でリッスン中...")
http.ListenAndServe(":8080", nil)
}
type gzipResponseWriter struct {
io.Writer
http.ResponseWriter
}
// io.Writer インターフェースの実装
func (w gzipResponseWriter) Write(b []byte) (int, error) {
return w.Writer.Write(b)
}