アイデアは、スライスに可変数のチャネルを持ち、それらを介して受信した各値を単一のチャネルにプッシュし、入力チャネルの最後のチャネルが閉じられたら、この出力チャネルを閉じることです。このようなものですが、2 つ以上のチャンネルの場合は次のようになります。
func multiplex(cin1, cin2, cout chan int) {
n := 2
for {
select {
case v, ok := <-cin1:
if ok {
cout <- v
} else {
n -= 1
}
case v, ok := <-cin2:
if ok {
cout <- v
} else {
n -= 1
}
}
if n == 0 {
close(cout)
break
}
}
}
上記のコードは、default
ケースがないため、ビジー ループを回避します。これは良いことです (編集: ", ok" の存在により、選択ステートメントが非ブロックになり、ループがビジー状態になっているように見えます。しかし、例のために、コードをブロックするかのように考えてください)。任意の数の入力チャネルでも同様の機能を実現できますか? 明らかに、これはスライスをペアごとに 1 つのチャネルに減らすことで実行できますが、可能であれば、より単純なソリューションにもっと興味があります。