miyazi888の覚え書き日記

学習したことを書き留めてます。

samber/loを試した

すでにgo1.19がリリースされてしまっていますが、1.18がリリースされた際にGoにGenericsが導入されて大きな話題になりました。

で、Genericsが導入されたら、絶対にどこかの誰かがfilterやmap関数みたいなののライブラリを作ると思っていたら、やっぱりありました。 その名もlo。

github.com

lodashを意識して開発された上に名前も短くしたくて、loになった模様。 lodashだと_.filterみたいな感じにしたかったんでしょうね。

install

go get github.com/samber/lo@v1

使ってみた

正直、公式のREADMEを読めばすぐに使い方はわかると思います。 それでも使い心地を試してみました。

   // 奇数のみを抽出
    results := lo.Filter([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, func(x int, _ int) bool {
        return x%2 != 0
    })
    fmt.Println(results) // [1, 3, 5, 7, 9]

今までforでがんばるしかなかったことを考えると、すっきり記述できてうれしい。

次は普通のオブジェクトでも絞り込んでみました。

type Item struct {
    Name string
    Type string
}

func main() {
    // オブジェクトの抽出
    items := []Item{{Name: "item1", Type: "foo"}, {Name: "item2", Type: "bar"}, {Name: "item3", Type: "foo"}}
    filteredItem := lo.Filter(items, func(e Item, _ int) bool { // 第二引数の関数の二番目の引数はindexです
        return e.Type == "foo"
    })
    fmt.Println(filteredItem) // [{item1 foo} {item3 foo}]
}

ちょっとJavaScriptっぽい感じで絞り込みが記述できました。

ちなみに今回は使いませんでしたが、Filter関数に渡す関数の第2引数はindexでした。

感想

上にも記述しましたが、これまでforでがんばるしかなかったことを思うと、だいぶ楽ですっきり記述できて良いな、というのが本音です。

あと、Genericsのサンプル集的に眺めることもできます。 ソースもだいぶシンプルで楽に読めると思います。 Genericsの使い方を忘れた時なんかにこのライブラリを思い出すと参考になりそうに思いました。

使う機会があれば、積極的に使いたいライブラリだと思いました。

ところでissueでこのライブラリの名前をgodashに変更したら? 的なissueが上がっててちょっと面白かったです。 github.com

その他

同じ作者の方がやっぱりGoのGenericsに対応したDIライブラリを公開していて、それもちょっと気になりました。 これも時間を見つけて試してみようと思います。