ホームページ > バックエンド開発 > Golang > Go でイテレータを慣用的に実装するにはどうすればよいですか?

Go でイテレータを慣用的に実装するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-02 04:48:13
オリジナル
394 人が閲覧しました

How Can I Idiomatically Implement Iterators in Go?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート