Go での個別のチャネルの作成
このプログラミングの質問では、Go の初心者が、一意の値を出力するチャネルを定義するための効率的なアプローチを模索します。 。具体的な要件は、整数値を受け入れ、個別の整数のみを送信するチャネルを作成することです。目標は、出力で整数の重複を避けることです。
応答の 1 つは、この機能を実現するために、マップを使用して以前に送信された値を保存することを提案しています。この方法では重複する値を効果的に排除できますが、メモリ使用量を考慮する必要があります。マップ データ構造では、キーと値のペアのコレクションを割り当てて維持する必要がありますが、慎重に管理しないとメモリ リークが発生する可能性があります。
実用的な解決策を提供するために、次のコード スニペットでは UniqueGen 関数を導入しています。指定された範囲内の一意の整数のチャネルを生成します:
<code class="go">func UniqueGen(min, max int) <-chan int { m := make(map[int]struct{}, max-min) ch := make(chan int) go func() { for i := 0; i < 1000; i++ { v := min + rand.Intn(max) if _, ok := m[v]; !ok { ch <- v m[v] = struct{}{} } } close(ch) }() return ch }</code>
UniqueGen 関数は、マップを使用して送信された整数を記録します。指定された範囲内の整数を繰り返し生成するゴルーチンを開始します。生成された値ごとに、関数はマップ内で値を検索することによって、その値がすでに送信されているかどうかを確認します。そうでない場合は、チャネル経由で整数を送信し、マップに記録します。このプロセスでは、重複する値が効果的に除外され、チャネルを通じて個別の整数のみが送信されるようになります。
UniqueGen 関数を使用して、次のテスト ケースを実装して動作を実証できます。
<code class="go">func TestShouldReturnDistinctValues(t *testing.T) { var c = make([]chan int) c <- UniqueGen(1, 1000) for e := range c { // only print distinct values fmt.println(e) } }</code>
このテスト ケースは、1000 個の一意の整数のチャネルを生成し、コンソールに出力します。 UniqueGen 関数を利用することで、テストで個別の値が出力されることを確認できます。
以上がGo で一意の整数のチャネルを作成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。