How Go uses concurrency with channels and goroutines