ホームページ >バックエンド開発 >Golang >Go ではイテレータをどのように実装できますか?またそのトレードオフは何ですか?

Go ではイテレータをどのように実装できますか?またそのトレードオフは何ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-01 17:27:10908ブラウズ

How Can Iterators Be Implemented in Go, and What Are Their Trade-offs?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。