Handling concurrency

We are managing our GetThisCar Goroutines by counting how many we've launched, and we leverage a WaitGroup variable to decrement that count when they complete. While it is true that many of our GetThisCar Goroutines execute in parallel, what's important is the way we handle their concurrency. Using the next iterator and the waitGroup variable, we are able to simply and effectively deal with their life cycle: starting with each Goroutine, receiving their results and closing carChannel when our counter indicates all the Goroutines are completed. Ever tried managing multiple threads of operation using Java or C++? Notice how we don't have to deal with managing mutexes and hard-to-debug race conditions? The ease of concurrency implementation is one of Go's many strengths.

Concurrency: A property of systems in which several processes are executing at the same time and potentially interacting with each other. Concurrency is about dealing with lots of things at once.

Parallelism: This is a type of computation in which many calculations are carried out simultaneously, operating on the principle that large problems can often be pided into smaller ones, which are then solved in parallel. Parallelism is about doing lots of things at once.

See Rob Pike's epic video, Concurrency Is Not Parallelism, at https://www.youtube.com/watch?v=cN_DpYBzKso.