Канал может быть буферизованным или небуферизованным (это означает, что в него можно отправить единственное значение переменной), и когда вы пытаетесь читать из небуферизованного канала, вы блокируете программу, в которой вы пытаетесь выполнить эту операцию. Чтобы разблокировать его, вы должны записать в канал в другой программе и наоборот, то есть, когда вы пишете в канал, вы блокируете программу, в которой вы выполняете эту операцию, но она будет разблокирована, когда вы попытаетесь прочитать из канал в другом рутине. Вы должны изучить эту функцию для разработки гибких (с параллелизмом) программ. Каналы используются для отправки данных между различными подпрограммами, которые должны работать независимо или параллельно. Вы можете создать конвейер из двух, трех или более процедур для последовательной отправки данных из одной программы в другую.
В этом примере я создаю канал типа bool ch . Невозможно точно сказать, какая строка 9-го и 11-го будет исполнена первой.
sendq - это список подпрограмм, ожидающих записи на канал. В этом случае основная ( func main ) подпрограмма ожидает выполнения строки с номером 9.
Еще один пример, когда у нас тупик. Выполнение никогда не перейдет на 8-ю строку, поэтому никогда не будет запущена процедура (следующая строка), в которой я пытаюсь записать данные в канал.
Более подробную информацию о каналах вы можете найти здесь:
http://dmitryvorobev.blogspot.com/2016/08/golang-channels-implementation.html
Существует такой термин, как планирование m: n. Golang имеет планировщик m: n, который на m goroutines может планироваться в n потоках ОС планировщиком Go.
https://medium.com/@riteeksrivastava/a-complete-journey-with-goroutines-8472630c7f5c
Рекомендую просмотреть эту книгу: https://www.amazon.com/Programming-Language-Addison-Wesley-Professional-Computing/dp/0134190440. На мой взгляд, это лучшая книга о Голанге, в которой дается описание многих концепций и особенностей этого языка.
О разнице между параллелизмом и параллелизмом вы можете прочитать здесь: https://www.ardanlabs.com/blog/2018/12/scheduling-in-go-part3.html