Поскольку цикл for
работает навсегда, ваш код работает навсегда. Получение от ch
после цикла for
никогда не достигается.
Если вы хотите, чтобы ваш код вышел из него, вы должны закончить цикл for
, например. заставить ее работать только определенное число итераций:
for i := 0; i < 5; i++ {
...
}
Так что если вы только пробежать 5 итераций (как в моем примере), после того, как for
цикл приема от ch
будет выполняться, который может блокировать (поскольку ch
небуферизован) если другие goroutines еще не запущены, и будет выполнен хотя бы один из запущенных goroutines, который отправит значение на канале, которое может привести к продолжению главного goroutine (поскольку его блокировка работает больше не блокирует).
Также обратите внимание, что Go Memory Model гарантирует, что определенные события произойдут до других событий, у вас нет гарантии, как выполняются 2 одновременных goroutines. У вас нет гарантии, что goroutines, запущенные в цикле for
, начнут выполняться до того, как главный goroutine будет заблокирован при получении от ch
.
Обычно, когда goroutine блокируется (например, операция приема блокирующего канала), среда выполнения может планировать запуск другого goroutine.
Почему вы используете for-loop? –
просто экспериментальный. Я просто хотел запустить goroutines и выйти из основной программы –