Go の Iterator パターン
Iterator パターンは、基礎となる要素を公開せずにコレクション内の要素を反復処理できるようにする設計パターンです。コレクションの表現。 Go でイテレータを作成するにはいくつかの方法があります。
チャネル
チャネルはイテレータのようなデータ構造です。 range キーワードを使用してチャネルを反復処理できます。ただし、ゴルーチンをリークせずにこのループを中止できないことが判明した場合、その使用は制限されます。
クロージャ
クロージャは、通常、イテレータの作成にはチャネルよりも適しています。これにより、変数をキャプチャし、呼び出し間で状態が保持される関数を作成できます。クロージャを使用して、値を生成するイテレータを作成できます。
func newEven() func() int { n := 0 return func() int { n += 2 return n } }
名前付き型
反復子を作成するメソッドで名前付き型を使用することもできます。これにより、コレクションを走査するためのより明示的で型安全な方法が提供されます。
type even int func (e *even) next() int { *e += 2 return int(*e) }
連鎖イテレータ
関数がファーストクラスのオブジェクトであるため、Go では連鎖イテレータを簡単に実装できます。マップやフィルターなどの関数を使用して、反復子の値をマップまたはフィルターすることができます。
func mapInt(g intGen, f func(int) int) intGen { return func() int { return f(g()) } } func square(i int) int { return i * i }
結論
Go でイテレータを作成する慣用的な方法は考慮されていません。ニーズに最適な方法を選択できます。一般に、クロージャと名前付き型は状態または連鎖動作を必要とするイテレータに適しており、チャネルはワンショット トラバーサルに適しています。
以上がGo ではイテレータをどのように実装できますか?またそのトレードオフは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。