15章ジェネリクス

Go言語の開発チームは新機能の追加を重視してはいません。そうは言っても、「固定された不変の言語」というわけでもないのです。新しい機能は、多くの議論と実験を経て、ゆっくりと採用されます。Go 1.0がリリースされた当初から、イディオム的なGoを定義するパターンには大きな変化がありました。最初はGo 1.7でのコンテキストの採用でした。続いてGo 1.11でモジュールが採用され、Go 1.13ではエラーのラッピングを採用しました。

そして次の大きな変化がやってきました。Goチームは、ジェネリクス (generics:総称型)と呼ばれる型パラメータ (type parameter)を言語に取り取り込み、Go 1.18に搭載しました。この章では、なぜジェネリクスが導入されたのか、Goのジェネリクスの実装で何ができるのか、ジェネリクスでは何ができないのか、そしてイディオム的なパターンをどのように変えるのかを探ります。

15.1 ジェネリクスによる繰り返しの削減と型安全性の向上

Goは静的型付け言語であり、コードのコンパイル時に変数や引数の型がチェックされます。マップ、スライス、チャネルなどの組み込みの型やlencapmakeなどの関数では異なる型の値を扱うことができますが、ユーザーが定義した型や関数ではこのようなことはできません。JavaやC++など、ジェネリクスをもつ言語に慣れ親しんできた人は、Goの型システムの単純さに少なからず不満を抱くことでしょう。コードが実行されるまで型が決まらない動的型付け言語に慣れている人は、なぜ今までGo言語にジェネリクスが導入されなかったのか、疑問に感じていた人もいるかもしれません。

ジェネリクスは「型パラメータ」、つまり「引数

Get 初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.