Чтобы запустить бесконечный цикл выполнения двух goroutines, я могу использовать следующий код:Как слушать N каналов? (оператор динамического выбора)
после получения сообщения об ошибке он запустит новый goroutine и продолжит вечно.
c1 := make(chan string)
c2 := make(chan string)
go DoShit(c1, 5)
go DoShit(c2, 2)
for ; true; {
select {
case msg1 := <-c1:
fmt.Println("received ", msg1)
go DoShit(c1, 1)
case msg2 := <-c2:
fmt.Println("received ", msg2)
go DoShit(c2, 9)
}
}
Теперь я хотел бы иметь такое же поведение для N goroutines, но как будет выглядеть оператор выбора в этом случае?
Это бит кода я начал с, но я запутался как код оператора выбора
numChans := 2
//I keep the channels in this slice, and want to "loop" over them in the select statemnt
var chans = [] chan string{}
for i:=0;i<numChans;i++{
tmp := make(chan string);
chans = append(chans, tmp);
go DoShit(tmp, i + 1)
//How shall the select statment be coded for this case?
for ; true; {
select {
case msg1 := <-c1:
fmt.Println("received ", msg1)
go DoShit(c1, 1)
case msg2 := <-c2:
fmt.Println("received ", msg2)
go DoShit(c2, 9)
}
}
Я думаю, что вы хотите, это мультиплексирование каналов. http://golang.org/doc/effective_go.html#chan_of_chan В принципе, у вас есть один канал, который вы слушаете, а затем несколько дочерних каналов, которые входят в основной канал. Связанный SO Вопрос: http://stackoverflow.com/questions/10979608/is-it-possible-to-multiplex-several-channels-into-one – Brenden