2022-12-29[Go]Collection操作が楽楽書けるsamber/loライブラリの紹介sellGo,Rails,Collection,Lo,samber元々RailsからGoの案件にうつって一ヶ月半ほど経過しました。1.18で追加されたジェネリクスを利用した外部ライブラリsamber/loを使えば楽に書けることを知って歓喜しました。自分と同じようにRails案件からGo案件に移ってきて絶望した人向けに、サンプルコードで対比して紹介したいと思います。このライブラリには弱点も存在するので、その辺も交えて紹介したいと思います。Rubyでは配列は「Array」と呼び、Goでも配列はあるけど、実際使うのはほぼ動的配列である「Slice」の方・・・ということで、この記事ではこれらの総称として「Collection」と呼ばせていただくことにします。残念ながら、全部紹介してるとキリがないので、比較的よく使うであろう一部の関数に絞ってサンプルコード付きで紹介します。Find()Filter()Map()FilterMap()Uniq()GroupBy()他にどんな関数があるか?はこの辺を眺めるとよいかと思います。Railsエンジニア向けに動作のイメージがつきやすいよう、同様の処理となるRubyのコードも対比として載せておきます。サンプルコードはそれぞれ動作確認済みです。結果を見たい場合は以下のサイトにサンプルコードを貼り付けて実行してみてください。非常に便利なsamber/loですが、以下の弱点があります(2022/12/29時点)。1一部の関数の実装でパフォーマンスの意識が甘い2繰り返し処理でエラーが発生した場合、それを返すことができない1一部の関数の実装でパフォーマンスの意識が甘い例えば、Filter()の内部実装は以下のようになっています。[]V{}となっていますが、Filter関数の性質上、「Filter後の要素数」は「元の要素数」を超えないことが自明です。len(collection))とするのが妥当と思われます(書籍「実用Go言語」を読んだ感じでは)。Collection系の便利関数に設定したい繰り返し処理(func())は、エラーが発生しうるような処理であることもあるでしょう。そのようなケースに対応できないのが現状です。iterateesものの、未だ解決はされていません。あとがき標準ライブラリにもsamber/lo的な便利関数ができてくれないものか・・・もしくはsamber/lo自体が標準ライブラリになってくれないかと思っています。