0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GoでforEachなど便利機能を提供してくれるgo-funkを紹介したい

Last updated at Posted at 2024-01-16

はじめに

go-funkはJavaScriptにあるforEactやMap,PHPなどにあるFindやGetなどの便利機能を提供してくれるライブラリです。
使い方は公式を見ればわかるので、ここでは代表的な機能について数行で紹介していきます。

github.com/thoas/go-funk

使用できる機能

個人的によく使用する順で載せていきます。ここに載っているものが全てではないので、公式で使いたいものがあるか探してみるのもいいと思います。

func Map(arr interface{}, mapFunc interface{}) interface{}
JSのmapと同じで、配列、スライスの各要素を2乗するなどの加工が可能。ただ、goの場合はMap機能によってmapからslice、sliceからmapに変更することができる。

func Find(arr interface{}, predicate interface{}) interface{}
指定された条件に該当する最初の要素を配列、スライスから見つける。funk.FindStringなど型ごとに種類がある。

func Filter(arr interface{}, predicate interface{}) interface{}
配列、スライスから指定した条件に合致する要素を抜き出す。

func Get(out interface{}, path string, opts ...option) interface{}
ネストされた構造体もしくはmapから要素を抽出する関数。Bar.Bars.Bar.Nameといった深いネストでも要素を取得可能。

func Set(in interface{}, val interface{}, path string) error
ネストされていても構造体の要素の値を一括で変更できる。

func Union(collections ...interface{}) interface{}
引数にした複数の配列、スライスの要素を全て足し合わせたものを作成できる。それぞれの異なる要素を結合して返すfunk.OuterJoinや2番目のコレクションから異種データを見つけて返すfunk.RightJoinが存在する。

func ForEach(arr interface{}, predicate interface{})
JSのforEachと同じで配列、スライスの各要素を抽出できる。funk.Mapのように各要素の加工できる。最後の要素から順に格納していくfunk.ForEachRightも存在する。

func Uniq(in interface{}) interface{}
配列から重複値を除いた新たな配列を作成できる。funk.UniqStringなど型ごとに種類がある。また、抽出した値にコールバック関数を適用できるfunk.UniqByも存在する。

func Subset(x interface{}, y interface{}) bool
ある配列、スライスが指定された配列、スライスを含んでいるか(Subsetか)を判定する。

func ToMap(in interface{}, pivot string) interface{}
構造体を複数渡すと、キー値 : 格納値 のmapを作成する。

func ContainsInt(s []int, v int) bool
slice, mapの中に指定した数字があるか真偽値で返す関数。型ごとにfunk.ContainsStringやfunk.ContainsUIntなどが存在する。

func IndexOf(in interface{}, elem interface{}) int
配列、スライス内で値が最初に現れるインデックスを取得する関数。 funk.IndexOfStringなど型ごとに種類がある。また、最後に値が見つかった箇所を返すfunk.LastIndexOfも存在する。

func Drop(in interface{}, n int) interface{}
配列またはスライスから指定した数分要素を削除する。DropStringなど型ごとに種類がある。最後の要素だけ捨てるfunk.Initialと最初の要素だけ捨てるfunk.Tailも存在する。また、配列またはスライスから指定した要素(配列、スライスで渡す)を削除するfunk.Subtract,func.Withoutも存在する。

func Intersect(x interface{}, y interface{}) interface{}
引数xとyの共通要素を抜き出す関数。文字列版のfunk.IntersectStringがある。

func Difference(x interface{}, y interface{}) (interface{}, interface{})
Intersectと逆で共通ではない要素を抜き出す関数。こちらもfunk.DifferenceStringなど型ごとに種類がある。

func Reduce(arr, reduceFunc, acc interface{}) interface{}
JSのreduceと同じで、配列、スライスの各要素を合算して合計値を出すなど可能。要素の合計値を算出するfunk.Sumも存在する。

func Prune(in interface{}, paths []string) (interface{}, error)
構造体に他の構造体の値を要素を指定してコピーする。例えば新しい構造体を作るときに既存の構造体からIdとNameだけコピーして他は初期値のままにしておくことが可能。構造体タグに同じ処理を行えるfunk.PruneByTagも存在する。

func Keys(out interface{}) interface{}
構造体からkey要素を配列、スライスとして抽出できる。構造体から要素だけを配列、スライスとして抽出するfunk.Valuesも存在する。

func Chunk(arr interface{}, size int) interface{}
配列を指定した数で分割する。こちらもfunk.ChunkStringなど型ごとに種類がある。逆に分割してある配列を結合するfunk.FlattenDeepも存在する。

func RandomString(n int, allowedChars ...[]rune) string
指定した文字数分のランダムな文字列を作成する。

func Reverse(in interface{}) interface{}
渡された配列、スライスの順番を逆転させる。funk.ReverseStringなど型ごとに種類がある。

func Shuffle(in interface{}) interface{}
配列、スライスの並び順をランダムにして返す。funk.ShuffleBoolなど型ごとに種類がある。

終わりに

車輪の再開発を防いでくれる、素晴らしいライブラリです。作者がパフォーマンスについてissueを求めているみたいなので、腕に自身のある方は参加してみてください。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?