runtime.Gosched()
не отменяет приоритетность вызывающей ее горутины, а просто уступает процессор другим горутинам. Вызывающая горутина остается активной и может быть запланирована для повторного запуска.
Короче говоря, runtime.Gosched()
не гарантирует, как долго может работать запланированная горутина. Горутина main
может быть перепланирована до того, как другая горутина сможет «полностью» выполнить операцию печати. И если это произойдет и горутина main
завершится, ваше приложение тоже завершится (в этом случае вы не увидите напечатанного 2
, а только 1
из main
).
runtime.Gosched()
не может использоваться для управления планированием горутины, его можно использовать только для того, чтобы горутина не монополизировала поток, в котором она выполняется.
runtime.Gosched()
не является инструментом синхронизации. Если вам нужно дождаться других запущенных горутин, используйте sync.WaitGroup
, например:
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println(2)
}()
fmt.Println(1)
wg.Wait()
Если запущенная горутина должна запускаться первой (до main
), тогда нет смысла запускать это как отдельная горутина, выполните работу на main
:
fmt.Println(2)
fmt.Println(1)