> -- Илья Ермаков писал(а):
> Синтаксис и семантика Goroutines в Go недурна. Те же сопрограммы.С явной точкой переключения.Однако их исполняет несколько потоков....Ну и... "довели бабы (треды) да кабаки (разделяемые объекты) до цугундера (гонок)".

А разве для гонок нужно несколько тредов? Вот пример из доки по race detector .
## Код:
```
func main() {
   var wg sync.WaitGroup
   wg.Add(5)
   for i := 0; i < 5; i++ {
      go func() {
         fmt.Println(i) // Not the 'i' you are looking for.
         wg.Done()
      }()
   }
   wg.Wait()
}
```

Али на ББ с корутинами такого же результата не добиться?
ИМХО гонки возникают не из-за тредов, а из-за параллельности как таковой. Когда есть некий объект, разделённый между несколькими деятелями, и которые могут с ним что-то делать параллельно и независимо друг от друга. Да, если тред один, то каждый кусок между передачами управления планировщику - как бы в своей критической секции. Но это избавляет лишь от части проблем, не от всех.

И, кроме того,https://habrahabr.ru/post/195574/
> -- Цитата:
> По умолчанию Go работает на одном потоке, используя свой шедулер и асинхронные вызовы. (У программиста создается ощущение многопоточности и параллельности.) В этом случае каналы работаю очень быстро. Но если указать Go использовать 2 и больше потока, то Go начинает использовать блокировки и производительность каналов может падать. Не хочется себя ограничивать в использовании каналов. Тем более, большинство сторонних библиотек при каждом удобном случае используют каналы. Поэтому часто эффективно запускать Go с одним потоком, как это сделано по умолчанию.
Т.е., проблему нескольких тредов нужно сначала включить, чтобы она начала работать.