Go には慣用的な反復子の実装はありますか?
チャネルは反復子を彷彿とさせ、range キーワードによる反復を提供します。ただし、ゴルーチン リークを作成せずにそのようなループから抜け出すことができないため、その有用性は制限されます。開発者は、より慣用的なイテレータ パターンを求めて、表現的に繰り返し処理し、map、filter、reduce などの演算子を使用してイテレータを結合する方法について疑問を投げかけました。
クロージャベースのアプローチ
チャネルの便利さにもかかわらず、多くの場合、クロージャの方が適していることがわかります。クロージャを使用すると、値を順次生成するイテレータを作成できます。以下に、クロージャを使用して偶数のイテレータを作成する例を示します。
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 でイテレータを慣用的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。