Go 1.27、ジェネリックメソッドを正式サポート インターフェースでは不可

Generic Methods in Go 1.27

Go 1.27、ジェネリックメソッドを正式サポート インターフェースでは不可

Go 1.27で、メソッドに型パラメータを定義できる「ジェネリックメソッド」が導入された。従来は構造体自体に型パラメータを追加する必要があり、設計上の問題があった。ただし、インターフェースでのジェネリックメソッドはサポートされない。実装はモノモーフィゼーションに基づくため、動的ディスパッチとの整合性が課題となっていた。

「Go 1.27では、具象型に対するジェネリックメソッドが許可されるが、インターフェースに対するものは許可されない」
  1. throwaw12

    アクティブに「モダン」なGoコードベースでジェネリクスを使っている人に聞きたいんだけど、Java/Springみたいなコードベースになりつつある?

    ジェネリクスが必要な理由は理解できるけど、Javaエコシステムがそれを過剰に使うせいで、コードを読むのがすごく難しくなるのが嫌なんだ。10レベルの親クラスから継承されてて、場合によってはJava Beanがジェネリック型に基づいて作られて、その親クラスが抽象クラスだったりするからね。

  2. tancop

    > Goのインターフェースシステムは実行時に動作します。インターフェースパラメータに渡された値の具体的な型は、プログラムの実行中に解決されます。この動的ディスパッチは、コンパイル時に解決されるジェネリクスと衝突します。

    もしコンパイラが各メソッドに対してvtableとモノモーフィゼーションされたバリアントの両方を生成したらどうだろう?ほとんどの呼び出しは静的バージョンを使うけど、インターフェースジェネリクスなどで必要な場所では仮想メソッドを呼ぶようにすればいい。

  3. dekdrop

    今日知った

    > しかし、Goのインターフェースシステムは実行時に動作します。インターフェースパラメータに渡された値の具体的な型は、プログラムの実行中に解決されます。

  4. DrCiphers

    つまりGoはJavaになりつつあるってこと?

  5. EdSchouten

    GoはしばしばCの後継と考えられています。Cにはメソッドがなく、グローバル関数しかありません。私の視点からすると、Goがメソッドを追加したのは、主にインターフェースと組み合わせて使えるようにするためです。インターフェースがジェネリックメソッドをサポートしていないことを考えると、個人的にはこの機能を追加する価値があったとは思いません。

この日のほかの記事

2026-08-20