2020.2.17現代ではスマートフォンからのインターネットアクセスが大幅に増えていますよね。スマートフォンは有線で繋ぐパソコンほど高速な通信は出来ませんし、通信データ容量も限られています。サーバー側のネットワークトラフィック量にも限界があり、1つ1つの通信に使用するデータ量を減らさなくてはなりません。その方法の1つとしてデータをgzip圧縮するのがあります。gzip圧縮するとしないでは、データ量が倍くらいに変わることも少なくありませんので、Webサーバーを運用する際には是非取り入れたい仕組みです。当記事では、サーバーからデータを送信する際にgzip圧縮する方法をご紹介します。パッケージ送信する元となるデータを用意クライアントがgzipに対応しているかチェックバッファーとライターを作成するデータを書き込んで圧縮するライターをクローズする必要なHTTPヘッダを送信する圧縮済みデータを送信するクライアントがgzip圧縮に対応していなければそのまま送信する終わりにgzip圧縮して送信するコード以下にそのコードをご紹介します。このコードは『Go言語でシンプルで簡単なHTTPサーバーの作り方』や『Go言語で複数ドメインにも対応可能なHTTPSサーバーの作り方』の記事で紹介したサーバープログラムの延長線上にある機能です。上記の記事で書いている内容は省いて説明していきますので、分からないことがあれば上記の記事を見れば解決するかもしれません。{log.Println(err)return}}}コードの解説では、上記のコードを部分ごとに解説していきます。パッケージバイトデータのバッファーを操作するのに使用します。パッケージ名前の通り、gzip圧縮に関連するパッケージです。パッケージ文字列操作に関するパッケージです。そのほかのものは他の記事でもご紹介している通りです。[]byte("Hello!")送信する元となるデータはバイトのスライスです。文字列としてHTMLを用意しました。{まず『http.Request』である『r』から『Header.Get』関数を使って『Accept-Encoding』HTTPヘッダを取得します。『strings』パッケージの『Contains』関数を使って、ヘッダに『gzip』の文字列が含まれているかチェックします。ヘッダは『GTmetrix』でも確認が可能であり、実際に確認したものが以下の画像です。赤色の枠で囲まれている部分がそうであり『gzip』の文字列も含まれていますね。gzip圧縮に対応しているということです。今回は、gzipに対応していれば圧縮し、していなければ圧縮せずにそのままデータを送信しています。gzip.NewWriter(gz)『new(bytes.Buffer)』で新しくバイトのバッファーを作成しており、『gzip』パッケージの『NewWriter』関数に先ほどのバッファーを指定してライターを新規作成します。return}ライターに『Write』関数を使ってデータを書き込みます。データを書き込むと同時にgzip圧縮されます。圧縮済みのデータはバッファーに保存されています。return}書き込んだらライターを『Close』関数を使ってクローズします。クローズしないと正常にデータが書き込まれない場合があります。圧縮済みデータを後でキャッシュしたりして利用したい場合は、クローズの後に『gz.Bytes()』として『[]byte』を取得しておいて下さい。"text/html")w.WriteHeader(http.StatusOK)『http.ResponseWriter』である『w』に『Header().Set』関数を使ってHTTPヘッダをセットしていきます。『Content-Encoding』ヘッダに『gzip』と書き込んで、送信したデータがgzip圧縮されていることを知らせます。『Content-Type』には今回はHTMLデータなので『text/html』をセットしておきます。最後に、『WriteHeader』関数に『http.StatusOK』をセットしてヘッダを送信します。return}バッファーの『WriteTo』関数を使って圧縮済みデータを送信します。引数に『w』を指定してデータの送信先を指定します。return}先ほどの送信方法とそれほど変わらないコードですが、『w』の『Write』関数を使ってデータを送っておきます。終わりに以上でコードの紹介はおしまいです。本来、圧縮処理というのは複雑な処理ですが、Go言語には豊富な標準ライブラリがありますし、そのおかげで簡単にgzip圧縮することが出来るようになっています。パフォーマンスも悪くないと思いますので、皆さんも是非利用してみて下さいね。コードの中にコードの解説。コンテンツの転載は固くお断りいたします。