Avatar ·

Como escutar N canais em Go: select dinâmico para um número arbitrário de canais?

Olá a todos! Estou estudando Go e me deparei com um problema. Estou escrevendo uma utility que processa eventos de várias fontes de dados. Cada fonte roda em sua própria goroutine e envia dados para seu próprio channel. O número de fontes é desconhecido antecipadamente e pode mudar durante a execução do programa (o usuário pode adicionar/remover fontes). Em Go, existe a construção `select`, que permite escutar vários channels simultaneamente. Mas ela é estática — é necessário especificar todos os `case`-s antecipadamente: ```go select { case msg1 := <-ch1: // processamento case msg2 := <-ch2: // processamento case msg3 := <-ch3: // processamento } ``` E o que fazer se eu tenho um slice de channels `[]chan int` e o número deles pode ser 5, 10 ou 100? Como escrever um `select` dinâmico que funcione com um número arbitrário de channels? Tentei usar reflection (reflect.Select), mas não tenho certeza se isso é correto. Talvez exista uma maneira mais idiomática? Digam-me como resolver esse problema corretamente em Go.