【Go】go-funkのFindメソッドの使い方


概要

go-funkは、GolangFilterやMapなどの関数が、手軽に使えるライブラリです。指定した要素を一つ取得するFindメソッドも用意されていますが、使い方等少し迷う部分があったので、今回少しメモ書きします。
なお、前提とするgo-funkのバージョンはv0.9.2です。

Findメソッドの概要

こちらのドキュメントにメソッドの一覧が記載されていますが、Findメソッドはinterface型で値をやり取りします。また、FindIntのように型名が指定されているメソッドも用意されていて、これを使用するとその型で値をやり取りできます。
なお、型名が指定されている場合、2つ目の返り値に値が見つかったかのフラグが設定されます。普通のFindでは返り値がinterfaceのみなので、これがnilかどうかで判断します。

実装サンプル

int型の配列を用意して、FindFindIntの双方で実行した結果をサンプルとして記載します。

package main

import "github.com/thoas/go-funk"

func main() {
	numbers := []int{1, 2, 3, 4}

	// Findメソッドだと返り値がinterface型
	// 見つからない場合はnil
	res1 := funk.Find(numbers, func(x int) bool {
		return x%10 == 0
	})
	if res1 == nil {
		println("nil") // nil
	}
	// 見つかった場合はキャストして値を取り出す
	res2 := funk.Find(numbers, func(x int) bool {
		return x%2 == 0
	})
	if res2 != nil {
		println(res2.(int)) // 2
	}

	// Find+型のメソッドだと結果が、二つ目の返り値に設定される
	// 見つからなかった場合は二つ目の返り値がfalse
	res3, success3 := funk.FindInt(numbers, func(x int) bool {
		return x%10 == 0
	})
	println(success3) // false
	println(res3)     // 0が設定される
	// 見つかった場合は二つ目の返り値がtrue
	res4, success4 := funk.FindInt(numbers, func(x int) bool {
		return x%2 == 0
	})
	println(success4) // true
	println(res4)     // 2が設定される
}