はじめに
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を求めているみたいなので、腕に自身のある方は参加してみてください。