title: Should I use sync or blocking channels?
body: <p>I have several go routines and I use <strong>unbuffered channels</strong> as sync mechanism. </p>
  
  <p>I'm wondering if there is anything wrong in this(e.g. compared with a WaitGroup implementation). A known <strong>"drawback"</strong> that I'm aware of is that two go routines may stay blocked until the 3rd(last) one completes because the channel is not buffered but I don't know the internals/what this really means.</p>
  
  <pre><code>func main() {
      chan1, chan2, chan3 := make(chan bool), make(chan bool), make(chan bool)
      go fn(chan1)
      go fn(chan2)
      go fn(chan3)
      res1, res2, res3 := &lt;-chan1, &lt;-chan2, &lt;-chan3
  }
  </code></pre>