why not just drop the select? i think the following is guaranteed because putting things on rc has to succeed before putting true into dc:
package main import ( "fmt" ) func do(i int, rc chan<- int, dc chan<- bool) { rc <- i dc <- true } func main() { worker := 10 rc := make(chan int, worker) done := 0 dc := make(chan bool, worker) for i := 0; i < worker; i++ { go do(i, rc, dc) } for done < worker { r := <-rc fmt.Println(r) <-dc done++ } } On Tue, Dec 18, 2018 at 5:35 AM Chris Burkert <burkert.ch...@gmail.com> wrote: > Dear all, > > I have a couple of goroutines sending multiple results over a channel - a > simple fan-in. They signal the completion on a done channel. Main selects > on the results and done channel in parallel. As the select is random main > sometimes misses to select the last result. What would be the idiomatic way > to prevent this and completely drain the result channel? > > Here is a minmal example which sometimes prints one 0 but should always > print two of them: > > package main > > import ( > "fmt" > ) > > func do(rc chan<- int, dc chan<- bool) { > rc <- 0 > dc <- true > } > > func main() { > worker := 2 > rc := make(chan int, worker) > done := 0 > dc := make(chan bool, worker) > for i := 0; i < worker; i++ { > go do(rc, dc) > } > for done < worker { > select { > case <-dc: > done++ > case r := <-rc: > fmt.Println(r) > } > } > } > > many thanks > Chris > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.