C# の LINQ、JS の map, filter など、多くのプログラミング言語には一般的なコレクション操作が提供されています。
一方、Go にはそういった機能・ライブラリはありません。しかし、Go1.18 で導入されるジェネリクスを使えばこういった一般的なコレクション操作を実装できるのでは?
やってみた
myMap
と myFilter
を実装してみました。
package main
import "fmt"
func myMap[T1, T2 any](s []T1, f func(T1) T2) []T2 {
var ret []T2
for _, v := range s {
ret = append(ret, f(v))
}
return ret
}
func myFilter[T any](s []T, f func(T) bool) []T {
var ret []T
for _, v := range s {
if f(v) {
ret = append(ret, v)
}
}
return ret
}
type hoge struct {
x int
y int
}
func main() {
s := []int{1, 2, 3, 4, 5, 6, 7}
t := myFilter[int](s, func(x int) bool {
return x%2 == 0
})
for _, v := range t {
fmt.Println(v)
}
u := myMap[int, hoge](s, func(x int) hoge {
return hoge{
x: x,
y: x * 2,
}
})
for _, v := range u {
fmt.Println(v)
}
}
Go 的にこれが美しいコードとされるのかは怪しいですが...僕が個人的に感じてた Go のコレクション操作の不足をこのようにして解決することができるかも?