вот зачем ты называешь код на go асинхронным и неблокирующим?
а разве это не так?) scheduler „распознаёт“ блокирующие горутины и swap’ит их, мы же вкурсе)
это делает код синхронным, а его выполнение - асинхронным и неблокирующим.
в event loop’е всё иначе, там блокировать нельзя совсем! там есть callback’и и его абсктракции аля Promises & async/await (не дай бог где-нибудь забыть await, заблокирует нахрен весь event loop)
асинхронный код сложнее гошного синхронного, даже с async/await. В event loop’е например нельзя выполнять сложные вычисления, это блокирует execution thread и следственно весь event loop и всё встаёт раком… в Go это делать можно, это заблокирует один из потоков, но не всю систему, а в добаков ещё можно использовать Go.Sched() для неблокирующих тяжёлых вычислений (аналог в event loop’е это что то вроде`runtime.tick()`)