Ideą jest posiadanie zmiennej liczby kanałów w wycinku, przepychanie każdej otrzymanej z nich wartości do jednego kanału i zamykanie tego kanału wyjściowego po zamknięciu ostatniego z kanałów wejściowych. Coś takiego, ale dla wielu kanałów więcej niż dwa:Czy można multipleksować kilka kanałów w jeden?
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
}
}
}
Powyższy kod unika zajęty pętle, ponieważ nie ma default
sprawa, która jest dobra (EDIT: wygląda na to, obecności „ok” sprawia, że instrukcja select nie blokuje się, a pętla jest zajęta, ale dla dobra przykładu myśl o kodzie tak, jakby blokowała). Czy ten sam rodzaj funkcjonalności można również osiągnąć za pomocą dowolnej liczby kanałów wejściowych? Oczywiście można tego dokonać, redukując kawałek pary do pojedynczego kanału, ale w miarę możliwości byłbym bardziej zainteresowany prostszym rozwiązaniem.
Ah, bardzo ładne rozwiązanie, jasne i zwięzłe. Dziękuję Ci! – elpres
Istnieje teraz pakiet z funkcją (https://godoc.org/github.com/eapache/channels#Multiplex), który rozwiązuje problem za pomocą odbicia zamiast wielu goroutines. – Evan