Ответ 1
Создание оценочных суждений всегда сложно, поэтому я выделим 3 отличия. Вы решаете, попадают ли они в ведро "pro" или "con".
-
Хотя и Go, и async позволяют вам писать асинхронный код простым способом, в .NET вы должны знать, какая часть вашего кода является асинхронной, а какая нет (т.е. вы должны явно использовать async/await keywords). В Go вам не нужно знать это - среда выполнения делает ее "просто работающей", нет специального синтаксиса для маркировки асинхронного кода.
-
Дизайн Go не требует специального кода в стандартной библиотеке..NET потребовалось добавить новый код в стандартную библиотеку для каждой операции async, по существу, удваивая поверхность API для этих случаев, например. там новый API загрузки асинхронного HTTP, а старый API-интерфейс без асинхронного HTTP должен оставаться для обратной совместимости.
-
Дизайн и реализация Go на порядок проще. Небольшой кусок кода времени выполнения (планировщик) заботится о приостановке голосовых команд, которые блокируют системные вызовы и уступают спальным goroutines. Нет необходимости в какой-либо специальной поддержке async в стандартной библиотеке.
Для реализации .NET сначала необходимо добавить вышеупомянутые новые API. Кроме того, реализация .NET основана на переписывании кода компилятора с помощью async/await в эквивалентные машины состояний. Это очень умно, но и довольно сложно. Практический результат заключался в том, что первый асинхронный CTP имел известные ошибки, в то время как реализация Go почти полностью работала с самого начала.
В конечном счете, это не имеет большого значения. async/await - лучший способ написать async-код в .NET. Goroutines - лучший способ получить это в Go. Оба они великолепны, особенно по сравнению с альтернативами на большинстве других языков.