LoginSignup
1
0

More than 1 year has passed since last update.

Go1.18からジェネリクスが導入されるらしいので、試してみた

Last updated at Posted at 2021-12-15

ジェネリクスとは、データの型を束縛せず、型そのものをパラメータ化して扱う技術です。
利点としては、型を抽象化して利便性を上げつつ、静的型付け言語の安全性を保つことのできることが挙げられます。

ジェネリクスを導入する前は

同一の処理をする関数であっても、型が違うだけでそれぞれ実装しないといけませんでした。
例えば、intfloat64で和を求めるシンプルな実装をするとしましょう。
和を求める処理自体は同じなのに、型が違うだけの理由で似たような関数を二つ用意することになります。
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」を選ぶことで、開発ブランチで試すことができます。
image.png

1
0
0

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
  3. You can use dark theme
What you can do with signing up
1
0