イテレータは、便利で表現力豊かな方法でコレクションを反復処理するために不可欠です。チャネルは最初は実行可能なオプションのように見えますが、プッシュ モデルとメモリ リークの問題により、その有用性が制限されます。
クロージャ:
クロージャイテレータを実装する簡単な方法を提供します。関数内の変数をキャプチャすると、関数をイテレータとして使用でき、呼び出しのたびに変数がインクリメントされ、その値が返されます。例:
import "fmt" 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) }
トレードオフと選択:
アプローチの選択は、特定の要件によって異なります。チャネルは同時シナリオに優れ、クロージャは柔軟性と使いやすさを提供し、名前付き型は明確さとカプセル化を提供します。
関数型プログラミングの概念を活用して、複雑な変換のために複数の反復子を連鎖させることができます。関数はイテレータに構成することができ、マッピング、フィルタリング、折りたたみなどの操作が可能です。
クロージャを使用してイテレータをチェーンする例を次に示します。
import "fmt" type intGen func() int func newEven() intGen { n := 0 return func() int { n += 2 return n } } func mapInt(g intGen, f func(int) int) intGen { return func() int { return f(g()) } } func square(i int) int { return i * i } func main() { gen := mapInt(newEven(), square) fmt.Println(gen()) fmt.Println(gen()) fmt.Println(gen()) }
Go の柔軟性と拡張性を利用することにより、関数型、反復子を簡単に組み合わせて、コレクションを効果的に変換および処理できます。
以上がGo でイディオムイテレーターを作成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。