1. Правильно ли я понимаю, что горутина выполняет какую-то элементарную операцию (или блок кода) после чего вызывается функция yield и начинает выполняться следующая горутина?
2. Правильно ли я понимаю, что любая блокирующая операция (вплоть до операции с памятью) после своего старта вызывает yield, чтобы переключиться на другую горутину?
3. Правильно ли я понимаю, что все блокирующие операции делегируются на системные треды в которых они выполняются. К примеру операция чтения файла блокирующая. Значит она скидывается в системный тред где происходит чтение и потом выполняется кол-бек? Системные треды Go сам создает? Или как оно там происходит?
Го обычно создает треды по количеству ядер процессора (можно изменить с помощью переменной GOMAXPROC). Горутины раскидываются между ними, так что даже элементарный код может работать параллельно в разных тредах.