ホームページ  >  記事  >  バックエンド開発  >  Go のパイプライン パターン

Go のパイプライン パターン

WBOY
WBOYオリジナル
2024-07-29 21:18:20963ブラウズ

The Pipeline Pattern in Go

パイプライン パターンは、ステージを通じて並行してデータを処理する強力な方法です。各ステージはデータに対して異なる操作を実行し、次のステージに渡します。

チャネルを使用してデータを渡すことで、パイプライン パターンにより多くの場合パフォーマンスが向上します。

アイデアは非常にシンプルで、各ステージがチャネル上で反復され、データがなくなるまでデータを取得します。データ項目ごとに、ステージはその操作を実行し、その結果を出力チャネルに渡し、入力チャネルにデータがなくなったら最後にチャネルを閉じます。 チャネルを閉じることは、下流ステージがいつ終了するかを知るために重要です

一連の数値を作成し、それらを 2 倍にし、低い値をフィルタリングして、最後にコンソールに出力します。

func produce(num int) chan int {
    out := make(chan int)
    go func() {
        for i := 0; i < num; i++ {
            out <- rand.Intn(100)
        }
        close(out)
    }()
    return out
}

func double(input <-chan int) chan int {
    out := make(chan int)
    go func() {
        for value := range input {
            out <- value * 2
        }
        close(out)
    }()
    return out
}

func filterBelow10(input <-chan int) chan int {
    out := make(chan int)
    go func() {
        for value := range input {
            if value > 10 {
                out <- value
            }
        }
        close(out)
    }()
    return out
}

func print(input <-chan int) {
    for value := range input {
        fmt.Printf("value is %d\n", value)
    }
}

func main() {

    print(filterBelow10(double(produce(10))))

}

main() を構造化するには明らかに、より読みやすい方法があります:

func main() {

    input := produce(10)
        doubled := double(input)
    filtered := filterBelow10(doubled)
    print(filtered)

}

ご自身の好みに基づいてスタイルをお選びください。

ここに何を付け加えますか?以下にコメントを残してください。

ありがとうございます!

この投稿とこのシリーズのすべての投稿のコードはここにあります

以上がGo のパイプライン パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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