Я хочу, чтобы рутинное прослушивание было прослушиванием на двух каналах, заблокировано, когда оба канала слиты. Однако, если оба канала содержат данные, я хочу, чтобы один из них был удален до того, как будет обработан другой.
В приведенном ниже рабочем примере я хочу, чтобы все out
были разряжены до обработки exit
. Я использую select
-statement, который не имеет приоритетного порядка. Как я могу обойти проблему, заставляя все 10 исходных значений обрабатываться до выхода?
package main
import "fmt"
func sender(out chan int, exit chan bool){
for i := 1; i <= 10; i++ {
out <- i
}
exit <- true
}
func main(){
out := make(chan int, 10)
exit := make(chan bool)
go sender(out, exit)
L:
for {
select {
case i := <-out:
fmt.Printf("Value: %d\n", i)
case <-exit:
fmt.Println("Exiting")
break L
}
}
fmt.Println("Did we get all 10? Most likely not")
}