[Go言語]Iteratorパターンを学ぼう!

こんにちは、KOUKIです。

この記事では、デザインパターンの一つであるIteratorパターンについて紹介します。

デザインパターンまとめ

シチュエーション

iterateは「繰り返す」という意味の英単語です。

Iteratorパターンは、要素の集まりを保有するオブジェクト(Go言語ではインスタンス)の各要素へ順番にアクセスする方法を提供するためのパターンです。

各要素へ順番にアクセスするとは、例えば以下のような処理です。

ここでは、Person構造体のパラメータを順番に取得しています。

Iteratorパターンを実装する方法は色々あるので、サンプルコードをみていきましょう。

チャネル版

チャネルを使ったIteratorパターンを紹介します。

InfoGeneratorメソッドは、戻り値を送信専用(<-)のチャネルを指定しています。これで、呼び出し元でチャネルにデータが入るまで処理を待機させることができます。

InfoGeneratorメソッド内では、チャネルへのデータの書き込みをgoroutineで動かしており、処理が完了したら「defer close(out)」にてチャネルを閉じます。呼び出し元ではチャネルが閉じられたことを感知するので、自動的にループから抜けます。

以前、似た処理を実装したことがあるので、参考までにどうぞ!

Iterator構造体版

次は、Iterator構造体使うバージョンです。

アクセスした要素をnextパラメータで管理しました。チャネル版より読みやすいコードですね。しかし、コード量は多くなります。

next/prev処理(おまけ)

定番のnext/prev処理も実装してみましょう。

OKですね。結構面白いです^^

まとめ

要素を繰り返し処理したい場合は、Iteratorパターンの導入を検討してみるのもありですね。

このパターンは、実務でも活躍しそうです。

それでは、また!

Go言語まとめ

ソースコード

チャネル版

Iterator構造体版

next/prev処理

コメントを残す