title: Defer close on multiple Goroutines?
body: <p>I have the following code:</p>
  
  <pre><code>package main
  
  import (
      "fmt"
      "time"
  )
  
  func main() {
      t := time.Now()
      stuff := fanIn(
          generator(4, 5, 6, 7),
          generator(1, 2, 6, 3, 7),
          generator(12, 15, 33, 40, 10),
          generator(18, 13, 20, 40, 15),
          generator(100, 200, 64000, 3121, 1237),
      )
  
      for v := range stuff {
          fmt.Println(v)
      }
  
      fmt.Println(t.Sub(time.Now()))
  }
  
  func generator(nums ...int) &lt;-chan int {
      out := make(chan int, 10)
      go func() {
          defer close(out)
          for _, v := range nums {
              out &lt;- v
          }
      }()
      return out
  }
  
  func fanIn(in ...&lt;-chan int) &lt;-chan int {
      out := make(chan int, 10)
  
      for _, v := range in {
          go func(ch &lt;-chan int) {
              for val := range ch {
                  go func(c int) { out &lt;- c }(val)
              }
          }(v)
      }
  
      return out
  }
  </code></pre>
  
  <p>It results in a deadlock on line 18:</p>
  
  <pre><code>for v := range stuff {...}
  </code></pre>
  
  <p>The issue (I think) is that I'm not deferring the close on the fanIn function that returns a read-only channel. I don't know when to defer it since it's got to wait for the end of multiple goroutines to complete. </p>
  
  <p>What's the idiomatic way to solve this deadlock? Is this code even idiomatic? </p>
  
  <p>Thanks!</p>
  
  <p><a href="https://play.golang.org/p/5ky8eBec2w" rel="noreferrer">GoPlay</a></p>