0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Go】Filter, Mapなどの便利関数を手軽に使いたい、そんなあなたへ

Posted at

はじめに

こんにちは、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に格納されます。

filter.go
even := lo.Filter([]int{1, 2, 3, 4}, func(x int, index int) bool {
    return x%2 == 0
})
// []int{2, 4}

Map

スライスの型を異なる型に変換することができる関数です。
第1引数にスライスを渡し、第2引数に変換を行う関数を渡します。

map.go
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時に返すものを渡します。

ternary.go
result := lo.Ternary(true, "a", "b")
// "a"

result := lo.Ternary(false, "a", "b")
// "b"

Uniq

与えられたスライスの中から、重複を除去したものを返す関数になります。

uniq.go
uniqValues := lo.Uniq([]int{1, 2, 2, 1})
// []int{1, 2}

おわりに

いかがでしたでしょうか?
今回ご紹介したもの以外で、まだまだ便利な関数が提供されていますので気になった方は是非公式のGitHubを覗いてみてください🫣

最後までご覧いただきありがとうございました!
以上、センリツでした。🤓

参考にしたサイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0