LoginSignup
0

More than 1 year has passed since last update.

posted at

Go のジェネリクスを使って map と filter を実装してみた

C# の LINQ、JS の map, filter など、多くのプログラミング言語には一般的なコレクション操作が提供されています。
一方、Go にはそういった機能・ライブラリはありません。しかし、Go1.18 で導入されるジェネリクスを使えばこういった一般的なコレクション操作を実装できるのでは?

やってみた

myMapmyFilter を実装してみました。

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 のコレクション操作の不足をこのようにして解決することができるかも?

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0