GolangのGenericsについてざっくり

any型

any型はinterface{}型のエイリアス
既存コードはgofmtで置換可能。

gofmt -w -r 'interface{} -> any' .

comparable型

==!=で比較できるもの。

関数定義と一緒に型パラメータを定義

関数定義

func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
    var s V
    for _, v := range m {
        s += v
    }
    return s
}

呼び出し

ints := map[string]int64{
    "first":  34,
    "second": 12,
}

floats := map[string]float64{
    "first":  35.98,
    "second": 26.99,
}

SumIntsOrFloats[string, int64](ints)
SumIntsOrFloats[string, float64](floats)

型パラメータとして値は以下のように関数の実引数から推論させることも可能

SumIntsOrFloats(ints)
SumIntsOrFloats(floats)

型宣言で型パラメータを定義

type Number interface {
    int64 | float64
}
func SumNumbers[K comparable, V Number](m map[K]V) V {
    var s V
    for _, v := range m {
        s += v
    }
    return s
}

呼び出し

SumNumbers(ints)
SumNumbers(floats)

参考

go.dev

zenn.dev