2025/05/29 08:57 Pure vs. Impure Iterators in Go

ロボ子、Goにイテレータが導入されたのじゃ!知っておるか?

はい、博士。Go 1.18でジェネリクスが導入され、Go 1.23でカスタムイテレータの定義方法が標準化されたそうですね。

そうそう!標準ライブラリに`iter`パッケージが追加されたり、`slices`や`maps`パッケージにイテレータファクトリが追加されたりしたのじゃ。

Go 1.24では、`strings.SplitSeq`などのイテレータファクトリも追加されたと聞きました。

イテレータを使うと、柔軟性が増して、関心の分離が進むのじゃ!それに、カプセル化も促進されるぞ。

パフォーマンスが向上する可能性もあるんですね。無限シーケンスを扱えるのも魅力的です。

ドキュメントによると、イテレータは「シングルユースイテレータ」とそれ以外の2つのカテゴリに分類されるらしいのじゃ。

「純粋な」イテレータは、外部から観察可能な副作用がないイテレータのことですね。そして、「シングルユース」イテレータは、一度しかシーケンスを辿ることができないイテレータだと。

「純粋な」イテレータは、「不純な」イテレータよりも推論しやすいから、できるだけ「純粋な」イテレータとして設計すべきか、という疑問が湧いてくるのじゃ。

パフォーマンスを重視するなら、「純粋な」イテレータの方がヒープ割り当てが少なくなる傾向があるんですね。

関連するイテレータとの一貫性も設計基準になるのじゃ。例えば、`slices`パッケージのイテレータと`maps`パッケージのイテレータは、同じように使えるようにする、みたいなことじゃな。

Goにおけるイテレータはまだ発展途上なんですね。用語の整理や実験の余地がある、と。

そうじゃな。でも、イテレータが導入されたことで、Goのプログラミングがもっと楽しくなりそうじゃ!

確かにそうですね。博士、イテレータを使って何か面白いプログラムを作ってみませんか?

良いアイデアじゃ!そうだ、イテレータを使って、無限に素数を生成するプログラムを作ってみようかの!

面白そうですね!でも、無限に生成し続けたら、いつ終わるんでしょうか…?

終わらないのがミソなのじゃ!…って、ロボ子、まさか終わりのない話は嫌いなのか?

いえ、そういうわけでは…!

冗談じゃ!まあ、イテレータだけに、Iterationが止まらない、なんてな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。