[Go言語]sync.Poolって結構便利だって気がついた件~初学者向け~

こんにちは。KOUKIです。

とあるWeb系企業で、Go言語エンジニアをしています。

学習のメモ代わりに記事を書いています。

今日は、syncパッケージのPoolを紹介したいと思います。

sync.Poolは、以下の構造体になっています。

Poolという名のとおり、何らかのものを貯めておけ、必要なタイミングになったらそれを取り出すことができます。

実際にコードで確認していきましょう!

sync.Poolなし版

最初にsync.Poolなし版のコードを紹介します。

log関数内で、「bytes.Buffer」を作成し、そこに出力したい文字を貯めて、最後に標準出力に出力する簡単なプログラムです。出力結果は以下です。

このコードは、log関数を呼び出すごとに「bytes.Buffer」を作成しているので、少し効率が悪いです。これをsync.Poolを使って改善してみましょう。

sync.Poolあり版

先ほどのコードをsync.Poolで書き換えたものがこちらになります。

sync.PoolのNewプロパティには無名関数をセットします。ここでは、bytes.Buffer」を返却する無名関数をセットしており、log関数内でキャスト(bufPool.Get().(*bytes.Buffer))して使っています。

Resetメソッドは、Buffer内を空にします。

最後に、buffer(変数b)をbufPoolのPutメソッドで保存してあげれば完成、というわけです。

出力結果は先ほどと変わりませんが、なかなか効率のいいプログラムになったと思います。

おわりに

sync.Poolは結構便利だと思いますが、それなりにプログラミングスキルが求められるかもしれないですね。

意外な落とし穴でバグを生まないように、慎重に実装していただけたらと^^;

それでは、また!

Go言語まとめ

まとめ記事


コメントを残す