🍘
【Go】go-funkを用いて配列に要素があるか確認する
概要
Golangで指定した値が配列に含まれているか確認したい場合、Javaのcontainsメソッドのようなものが標準で用意されていないので、何かしら実現する手段の検討が必要です。
対象の型が決まってるなら配列に要素があるか確認する方法(containsみたいな関数はない)の記事にあるような自前の実装で良いのですが、なんでも対応できるようにすると少し考えなければなりません。自前実装ならGoで型に縛られない良い感じのContains関数の書き方の記事を参考になりますが、何か良い感じのライブラリないかなということで、今回の記事になります。
使用するライブラリ
以前に私が書いた記事Golangで配列からMaxの値を取得する方法を考えるにて、go-funkというmap関数やfilter関数を提供しているライブラリを紹介したのですが、このgo-funkにContains関数が用意されています。
使用方法はこちらのドキュメントに紹介されている通り、プリミティブ型には対応しているっぽくて、structでプロパティを指定した判定とかもできるようです。
実装サンプル
以下に判定の実装サンプルを記載します。なお、使用しているgo-funkのバージョンはv0.9.1です。
sample.go
import (
"fmt"
"github.com/thoas/go-funk"
)
// SampleStruct サンプル用の構造体
type SampleStruct struct {
Key string
Value string
}
func main() {
// 数字が含まれているか
var numberSlice = []int{1, 2, 3, 4, 5, 6}
fmt.Println(funk.Contains(numberSlice, 6))
// 文字列が含まれているか
var stringSlice = []string{"a", "b", "c"}
fmt.Println(funk.Contains(stringSlice, "c"))
// structに指定したキーが含まれているか
var structSlice = []SampleStruct{{
Key: "key1",
Value: "value1",
}, {
Key: "key2",
Value: "value2",
},
}
fmt.Println(funk.Contains(structSlice, func(structSlice SampleStruct) bool {
return structSlice.Key == "key1"
}))
}
Discussion