Goに導入されるGenericsについてまとめてみた


Go言語にGenericsが導入されるらしい

来年8月にリリースされる Go 1.17 にGenericsが導入されるらしい
https://blog.golang.org/generics-next-step

雑な訳

私たちは、Goコミュニティにジェネリックを試す機会を与えてくれることを願っています。
まず、ジェネリックコードは意味があるのか?Goのように感じられるか?人々はどのような驚きに遭遇するので
しょうか?
第二に、多くの人がGoにはジェネリックが必要だと言っていますが、それが何を意味するのかは必ずしも正確に
はわかりません。この草案は、この問題に有用な方法で対処していますか? Goにジェネリックがあれば解決でき
るのに」と思わせるような問題があった場合、このツールを使ったときにその問題を解決できますか?
私たちは、Goコミュニティから集めたフィードバックをもとに、今後の進め方を決定します。デザインの草案が
好評で、大幅な変更が必要ない場合は、次のステップとして、正式な言語変更の提案を行います。期待値を設定
するために、設計草案に全員が完全に満足し、これ以上の調整を必要としない場合、ジェネリック医薬品をGoに
追加できるようになるのは、2021年8月に予定されているGo 1.17のリリースが最も早いでしょう。もちろん、
実際には予期せぬ問題が発生する可能性もありますので、これは楽観的なタイムラインであり、明確な予測はで
きません。

Genericsとは

「総称性(Genericity)」「ジェネリック・プログラミング」とも呼ばれるプログラミング技法で、 オブジェクト指向とは異なるパラダイムからきたもの。 データの型に束縛されず、型そのものをパラメータ化して扱うことができる。
特徴は、型を抽象化してコードの再利用性を向上させつつ、静的型付け言語の持つ型安全性を維持できることである。
従来の静的型付け言語において、ソートなどのアルゴリズムや連結リストのようなデータ構造(オブジェクトのコンテナ)を記述する際は、たとえ対象となる要素のデータ型が異なるだけで事実上同一のコードであったとしても、具体的なデータ型ごとにそれぞれ実装しなければならない。整数型のリスト、浮動小数点のリストなどなど

C++やJava、RustやSwiftなど、他のほとんどの静的型付け言語がサポートしている機能

なぜGoにGenericsがなかったのか

どこかの時点で、ジェネリックは追加されることでしょう。我々は、ジェネリックを急いで実装する必要はないと思っていますが、一部のプログラマにとって必要であることは理解しています。ジェネリックは便利ではありますが、型システムとランタイムに複雑さによるコストをもたらします。我々は、この複雑さに見合うだけの価値を持つ設計のアイデアをまだ見つけることができていませんが、これからも継続して考えていきます。
差し当たっては、Go言語に組み込まれているマップとスライス、および空インタフェースを使ったコンテナ(明示的なunboxingが必要)を利用することで、ほとんどの場合、ジェネリックで実現可能なことと同等のコードを如才なくとはいきませんが記述することが可能です。
この問題は、未解決のままにしておきます。

Goの開発チームが比較的保守的だった。Rob Pikeは以下のように言っている

我々とコミュニティが数年間 Go を使い続けた結果、修正したいと思う事が山ほどありましたが、それらの変化は破壊的な物でした。
そこで我々はコミュニティを引っ張っていくために、"go fix" コマンドを使って慎重にプログラムの更新をを実施しましたが、それが完了した後に我々は、その更新をやめるだけでなく以降、言語の変更を停止し続ける事を約束しました

Genericsはすでに使うことができる


$ git clone https://go.googlesource.com/go
$ cd go
$ git checkout dev.go2go 
$ cd src
$ ./make.bash

GoPlayGroudのgo2goバージョンでも使える
https://go2goplay.golang.org/

例文は以下のサイトが参考になるので、参照してみてください。
https://bitfieldconsulting.com/golang/genericsGo