Not for nothing but channels become a bottleneck pretty early when you start doing highly concurrent golang.
You can very carefully design around it using only channels but it quickly starts making more sense to just use a different concurrency abstraction.