最終更新
リンドくん
たなべ先生、Go言語で「ジェネリクス」って機能があるって聞いたんですけど、これって何なんですか?
たなべ
ジェネリクスは型を抽象化する仕組みで、Go 1.18から正式に導入されたんだ。
簡単に言うと、同じような処理を複数の型で使い回せるようになる機能なんだよ。
Go言語を学習している皆さんの中で、「同じような処理なのに、int用とstring用で別々の関数を書くのは面倒だな...」と感じたことはありませんか?
実は、Go言語のバージョン1.18からジェネリクス(Generics)という画期的な機能が追加され、このような悩みを解決できるようになりました。
ジェネリクスを使えば、型を抽象化してより柔軟で再利用性の高いコードを書くことができます。
本記事では、Go言語のジェネリクスについて、プログラミング初心者の方でも理解できるよう、基本概念から実践的な使い方まで段階的に解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
型を抽象化するって具体的にはどういうことなんですか?
たなべ
例えば、配列の中から最大値を見つける関数を考えてみよう。
今まではint用、float用、string用と別々に書く必要があったけど、ジェネリクスを使えば1つの関数で全部対応できるようになるんだ。
Go言語でジェネリクスが導入される前は、同じような処理でも型が違うと別々の関数を書く必要がありました。例えば、以下のような状況です。
このようにコードの重複が発生し、保守性が悪くなってしまいます。
ジェネリクスを使用すると、上記の3つの関数を1つにまとめることができます。
この1つの関数で、int
、float64
、string
など、比較可能な全ての型に対応できるのです。
ジェネリクスの主なメリット
Go言語のジェネリクスでは、型パラメータを使って型を抽象化します。基本的な構文は以下の通りです。
構文の要素説明
[型パラメータ名 制約]
- 角括弧内で型パラメータを定義型パラメータ名
- 通常はT
、U
、V
などの大文字を使用制約
- その型パラメータが満たすべき条件を指定最も基本的な例として、2つの値を受け取って最初の値を返すだけの関数を見てみましょう。
この関数の使用例:
ポイント
any
は「どんな型でも受け入れる」という意味の制約です複数の型パラメータを定義することも可能です。
リンドくん
さっきから出てくる「制約」って何ですか?any
以外にもあるんですか?
たなべ
制約は型パラメータが満たすべき条件を指定するものなんだ。
any
は「何でもOK」だけど、例えば「比較できる型のみ」や「数値型のみ」といったより具体的な条件を指定できるよ。
Go言語には、よく使用される制約がいくつか組み込まれています。
any
- 任意の型comparable
- 比較可能な型独自の制約を定義することも可能です。これにより、より細かい型の条件を指定できます。
使用例
制約にメソッドを含めることで、特定のメソッドを持つ型のみを受け入れることができます。
リンドくん
ジェネリクス、便利そうですね!でも何か注意することはありますか?
たなべ
確かに便利だけど、使いすぎに注意が必要なんだ。
また、エラーメッセージが複雑になることもあるから、最初はシンプルな例から始めるのがおすすめだよ。
問題: 不適切な制約を選んでしまい、コンパイルエラーが発生する
解決法: 適切な制約を使用する
問題: 型推論に頼りすぎて、意図しない型が推論される
解決法: 明示的に型を指定する
注意点: ジェネリクスはランタイムのパフォーマンスオーバーヘッドはほぼありませんが、コンパイル時間が増加する可能性があります。
ベストプラクティス
リンドくん
ジェネリクス、最初は難しそうに感じましたが、だんだん理解できてきました!
たなべ
最初は基本的な使い方から始めて、徐々に複雑な例に挑戦していけばいいんだ。
ジェネリクスをマスターすれば、より柔軟で再利用性の高いGoコードが書けるようになるよ。
Go言語のジェネリクスについて、基本概念から実践的な活用法まで解説してきました。ジェネリクスは一見複雑に見えるかもしれませんが、その本質は「型を抽象化して、再利用性の高いコードを書く仕組み」です。
重要なポイントを再確認しましょう。
ジェネリクスは、Go言語をより表現力豊かで効率的な言語にしてくれる強力な機能です。
最初は基本的な関数から始めて、徐々にデータ構造やより複雑な処理に応用していけば、必ずマスターできるでしょう。
プログラミング学習において重要なのは、実際に手を動かして試してみることです。
今回紹介したサンプルコードを実際に書いて動かしてみて、ジェネリクスの威力を体感してみてください。