I agree. I&#x27;ve found Go channels to be disappointing in practice. There&#x27;s lots of PR but little criticism of something so key.<p>The fact that they are implemented using mutexes is, from my admittedly limited, non-concurrency-expert perspective, inexplicable. The simplest use case, an unbuffered channel, should be trivial to implement using CAS. There&#x27;s a bunch of research on implementing robust queues using CAS.<p>Then there are the various ugly edge cases: Closing a closed channel is an error (now you have to implement your own refcounting implementation if you want to hand out a single channel to multiple consumers), receive on nil channel blocks (means you can&#x27;t use nil as a signal to mean &quot;I&#x27;ve closed the channel&quot;), etc.<p>I really like GCD&#x27;s style of enqueueing concurrent tasks, which I think is a concurrency model that often works more naturally than channels. A major difference between GCD and goroutines is that you can specify what queue to use. I&#x27;m looking forward to see what they come up with for Swift.