Room A
Advanced
40 mins.
みなさんは、Go1.18でジェネリクス(型パラメタ)が登場したとき、どのようにそのエコシステムが発展していくか想像しましたか? もっと遡れば、Go Modulesの登場からGo1.21の後方互換性の強化[#57001]、そしてfor文のループ変数に関する変更[#57969]を互換性を崩さないように導入する流れを予想できたでしょうか?
※ [#XXXX]は関連するGoのissue番号を表しています。
Goは毎日徐々に進化しています。Goチームやコントリビューターは日々議論を重ね、後方互換やその後のエコシステムの発展を考えながら機能を追加していっています。その進化は驚くほど滑らかに我々の開発体験を壊さずに、そしてジェネリクス(型パラメタ)のような大きな機能も取り入れられながら行われています。
本セッションは、ほぼ毎日Goのissueの一覧を眺め、毎週木曜日前後に公開されるプロポーザルレビューミーティングの結果を確認することで得られた知見を基に次の大きな機能であるイテレータに関する話題を扱います。
Go1.23では、for range文において関数経由で任意のデータ構造をイテレーションする仕組み(イテレータ)が導入されます[#61405]。mapsパッケージでは、ついにKeys関数がイテレータを返す関数として導入され[#61900]、slicesパッケージ[#61899]やstringsパッケージ[#61901]、regexpパッケージでもイテレータを使った関数が導入されるでしょう[#61902]。Map関数やFilter関数など、イテレータに作用する関数についても導入が議論されています[#61898]。
イテレータは、任意のデータ構造やデータストリームを1つのシーケンシャルなデータ列として提供する仕組みとして捉えることができます。実際、Go1.23で導入されるイテレータは、iterパッケージとしてSeq[V]型やSeq2[K, V]型として提供されます[#61897]。これはGoが提供しているio.Writer型やio.Reader型、そしてfs.FS型で提供している高度な抽象化に通づるものがあります。さまざまなデータ、データの流れ、処理がイテレータで表現されるようになるでしょう。
本セッションでは、Goにおけるイテレータという概念がどのように生まれ[#47203]、どういう機能として提供される予定なのかコミュニティのディスカッションを追いながら解説します。そして、イテレータが生み出すであろうエコシステムについてコミュニティでの議論を振り返りながらまとめ、Goの未来がどのように変わっていくのかサンプルコードを示しながら次のような予想を展開します。
■ 予想1:エラーを伴う処理への応用 各プロポーザルでGoogleのGoチームが予想しているように、イテレータはデータ構造をイテレーションするための機能に留まらず、(*sql.DB).Scan関数や(*bytes.Scanner).Scan関数のようなエラー処理を伴うリソースの読み込みなどにも使用されていくでしょう[#65236]。
■ 予想2:sync.WaitGroupやerrgroup.Groupへの応用 Go1.22でリリースされたmath/rand/v2パッケージ[#61716]やGopherCon 2023でも発表が行われ、その動向が注目を浴びているencoding/json/v2パッケージ[#63397]など、標準ライブラリのv2が盛んに議論されています。また、sync/v2パッケージを期待する声もあり、その中でsync.WaitGroupが改善される可能性も考えられます。予想ではありますが、golang.org/x/sync/errgroupパッケージがsync/v2パッケージに含まれるようになれば、ゴルーチンの処理をWaitメソッドで待ったり、github.com/sourcegraph/conc/poolパッケージのResultContextPool型のようにスライスで処理結果を取得するのではなく、イテレータによって処理の結果を取得するようになるかもしれません。
本セッションを通して、イテレータの基礎だけに留まらず、それが普及した後のエコシステム、そして今後のGoの進化について考える機会を提供できたらと思います。
● 関連するissue [#57001]: https://go.dev/issues/57001 [#57969]: https://go.dev/issues/57969 [#33502]: https://go.dev/issues/33502 [#61405]: https://go.dev/issues/61405 [#61900]: https://go.dev/issues/61900 [#61899]: https://go.dev/issues/61899 [#61901]: https://go.dev/issues/61901 [#61902]: https://go.dev/issues/61902 [#61898]: https://go.dev/issues/61898 [#61897]: https://go.dev/issues/61897 [#47203]: https://go.dev/issues/47203#discussioncomment-1034432 [#65236]: https://go.dev/issues/65236#issuecomment-1906793427 [#61716]: https://go.dev/issues/61716 [#63397]: https://go.dev/issues/63397