ホームページ  >  記事  >  バックエンド開発  >  Go ですべてのチャネルが閉じているときに「select」ステートメントから抜け出すにはどうすればよいですか?

Go ですべてのチャネルが閉じているときに「select」ステートメントから抜け出すにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-12 19:42:02458ブラウズ

How to Break Out of a `select` Statement When All Channels Are Closed in Go?

すべてのチャネルが閉じているときに select ステートメントを終了する

Go では、select ステートメントを使用することが複数のチャネルを処理する効率的な方法です同時に。ただし、最終的に閉じるチャネルを扱う場合は、すべてのチャネルが閉じるまでループする簡潔な方法を見つける必要があります。

2 つのゴルーチンが独立してデータを生成し、それをチャネルに送信する次の例を考えてみましょう。メインのゴルーチンは、順序に関係なくこのデータを消費します。

for {
    select {
    case p, ok := <-mins:
        if ok {
            fmt.Println("Min:", p)
        }
    case p, ok := <-maxs:
        if ok {
            fmt.Println("Max:", p)
        }
    }
}

この select ステートメントでは、各出力を到着時に消費できますが、両方のチャネルが閉じている場合にループから明示的に抜け出す方法はありません。

提案された解決策は、ブール値フラグを使用して各チャネルのステータスを追跡することを伴いますが、多数のチャネルでは扱いにくくなる可能性があります。

より洗練された解決策は、次の場合にチャネルに nil を割り当てることです。閉まってしまいました。これにより、nil チャネルが通信に選択されなくなります。

for {
    select {
    case x, ok := <-ch:
        fmt.Println("ch1", x, ok)
        if !ok {
            ch = nil
        }
    case x, ok := <-ch2:
        fmt.Println("ch2", x, ok)
        if !ok {
            ch2 = nil
        }
    }

    if ch == nil && ch2 == nil {
        break
    }
}

nil チャネルを使用すると、select ステートメントは閉じたチャネルを自動的にスキップします。すべてのチャネルが閉じられると、ループは中断されます。このソリューションは、関与するチャネルの数に関係なく、select ステートメント内でチャネルを閉じる処理をクリーンかつ効率的に行う方法を提供します。

以上がGo ですべてのチャネルが閉じているときに「select」ステートメントから抜け出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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