はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)
Goには、標準でFilterやMap、FindやFirstなどの関数が実装されていません。
しかし、ジェネリクスの登場によりこれらの便利な関数を実装できるようになりました。
そこで今回は、ジェネリクスを用いた便利関数がまとめられているライブラリであるsamber/loをご紹介します😁
便利ライブラリ「samber/lo」
✨ samber/lo is a Lodash-style Go library based on Go 1.18+ Generics.
Go 1.18から登場したジェネリクスを元にしたLodashスタイルのGoライブラリです。
Lodashとは、JavaScriptの便利な関数を提供しているライブラリのことで、samber/loはそのGo版になります。
名前の由来も紹介されており、Lodashのような短い名前かつGoパッケージで使われていないことが挙げられていました。
Why this name?
I wanted a short name, similar to "Lodash" and no Go package uses this name.
。。。どういう名前の由来?🤔
提供されている便利関数
では早速提供している関数を紹介します!
かなりの数ありますので、今回は個人的に使う頻度が高そうな関数に絞っています。
Filter
まずは言わずもがな、スライスの中から条件に合致している要素だけを取り出すことができる関数です。
第1引数にスライスを渡し、第2引数に条件が合致するか判定する関数を渡してあげることで、Trueとなった要素のみが抽出されeven
に格納されます。
even := lo.Filter([]int{1, 2, 3, 4}, func(x int, index int) bool {
return x%2 == 0
})
// []int{2, 4}
Map
スライスの型を異なる型に変換することができる関数です。
第1引数にスライスを渡し、第2引数に変換を行う関数を渡します。
import "github.com/samber/lo"
lo.Map([]int64{1, 2, 3, 4}, func(x int64, index int) string {
return strconv.FormatInt(x, 10)
})
// []string{"1", "2", "3", "4"}
また、Map関数はgoroutine
で呼び出されますが、結果は毎回同じものになります。
Ternary
JavaScriptの三項演算子みたいな書き方ができる関数です。
第一引数にbooleanで表される条件式、第2引数にはTrue時に返すもの、第3引数にはFalse時に返すものを渡します。
result := lo.Ternary(true, "a", "b")
// "a"
result := lo.Ternary(false, "a", "b")
// "b"
Uniq
与えられたスライスの中から、重複を除去したものを返す関数になります。
uniqValues := lo.Uniq([]int{1, 2, 2, 1})
// []int{1, 2}
おわりに
いかがでしたでしょうか?
今回ご紹介したもの以外で、まだまだ便利な関数が提供されていますので気になった方は是非公式のGitHubを覗いてみてください🫣
最後までご覧いただきありがとうございました!
以上、センリツでした。🤓