Concurrency in Go is built on three interdependent features: goroutines, channels, and the select statement. Granted, there are helpers like sync.WaitGroup and sync.Once that make concurrency simpler. Also, under the covers you have standard lower-level features, like mutexes, conds, and atomics. But when people solve problems with concurrency in Go, they are mostly looking at goroutines, channels