ジェネリクスとは、データの型を束縛せず、型そのものをパラメータ化して扱う技術です。
利点としては、型を抽象化して利便性を上げつつ、静的型付け言語の安全性を保つことのできることが挙げられます。
ジェネリクスを導入する前は
同一の処理をする関数であっても、型が違うだけでそれぞれ実装しないといけませんでした。
例えば、int
とfloat64
で和を求めるシンプルな実装をするとしましょう。
和を求める処理自体は同じなのに、型が違うだけの理由で似たような関数を二つ用意することになります。
https://go.dev/play/p/9uIhwWrlJK1
func main() {
sumInt := sumInt(1, 2)
fmt.Println(sumInt, " is ", reflect.TypeOf(sumInt))
sumFloat64 := sumFloat64(1.0, 2.0)
fmt.Println(sumFloat64, " is ", reflect.TypeOf(sumFloat64))
}
func sumInt(a, b int) int {
return a + b
}
func sumFloat64(a, b float64) float64 {
return a + b
}
ジェネリクスを導入後は
型そのものをパラメータ化して扱うことができるので、一つの関数で済むようになります。
例えば、 ジェネリクスを使って上記の処理を実装すると、こうなります。
https://go.dev/play/p/uaMTQ1QV9lO?v=gotip
func main() {
s1 := sum(1, 2)
fmt.Println(s1, " is ", reflect.TypeOf(s1))
s2 := sum(1.0, 2.0)
fmt.Println(s2, " is ", reflect.TypeOf(s2))
}
func sum[T int | float64](a, b T) T {
return a + b
}
ジェネリクスを試すには
The Go Playgroundで試すことができます。
デフォルト状態では、「Go release」が使用されます。
ジェネリクスは、「Go dev branch」を選ぶことで、開発ブランチで試すことができます。