https://github.com/PacktPublishing/Mastering-Go-Second-Edition
Самая большая проблема при использовании нескольких каналов и ключевого слова select — это взаимоблокировки.
select позволяет горутине дождаться завершения нескольких операций коммуникации
функция sync.Done(), которая уменьшает тот же счетчик на единицу.
Каждый вызов sync.Add() увеличивает счетчик в переменной sync.WaitGroup на единицу. Обратите внимание: очень важно вызвать sync.Add(1) перед оператором go, чтобы предотвратить возможное состояние гонки.
Горутины легче потоков, которые, в свою очередь, легче процессов.
Процесс — это среда выполнения, в которой содержатся инструкции, пользовательские данные и части системных данных, а также другие типы ресурсов, полученные во время выполнения программы, тогда как сама программа — это файл, в котором содержатся инструкции и данные, используемые для инициализации инструкций и пользовательских данных процесса.
Поток — это меньшая и более легкая сущность, чем процесс или программа. Потоки создаются процессами, имеют собственный процесс управления и стек.
Горутина — это минимальная сущность Go, которая может быть выполнена конкурентно.
Канал — это механизм коммуникации, который, помимо прочего, позволяет обмениваться данными между горутинами.