🍘

【Go】go-funkを用いて配列に要素があるか確認する

2021/09/28に公開

概要

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