swdyh

go-enumerable golangでスライスにmapとかfilter

2013-07-09 16:50:00

Golangでスライスに対して、 map, filter(select), some(any), every(all), reduce(inject, foldl), reduceRight(foldr)を作る関数を書いてみました。

静的型言語でジェネリックがないGoだと、それらの関数そのものは書けない、もしくは書けても特定の型に専用か、interface{}を使うことになって使いにくくなってしまうのでリフレクションを使って動的に関数を作ってみることにしました。そのせいで静的チェックがあまり効かないので、堅牢なものを書きたいときにはふつうにforとrangeを使うのがいいと思います。リフレクションを使った例としては面白い気がしました。

var twiceInt func([]int) []int
enumerable.MakeMap(&twiceInt, func(i int) int { return i * 2 })
fmt.Println(twiceInt([]int{1, 2, 3})) // [2 4 6]

var filterOdd func([]int) []int
enumerable.MakeFilter(&filterOdd, func(i int) bool { return i%2 == 1 })
fmt.Println(filterOdd([]int{1, 2, 3})) // [1 3]

Github https://github.com/swdyh/go-enumerable