Оператор go
не может завершиться ошибкой (только в «экстремальных» обстоятельствах, например, из-за нехватки памяти, но в противном случае оператор go
будет наименьшей из ваших проблем).
Конечно, без синхронизации у вас нет гарантии, когда запланировано выполнение этой программы. Таким образом, ваше примерное использование sync.WaitGroup
неверно, так как если бы подпрограмма не была запланирована до тех пор, пока main
не достигнет wg.Wait()
, она может даже никогда не начаться, как, когда заканчивается подпрограмма main
, ваша программа также заканчивается.
Вместо этого увеличьте счетчик WaitGroup в главной программе (и лучше всего вызвать WaitGroup.Done()
deferred, поэтому он вызывается, даже если программа запаникует):
var wg = &sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("halo world")
}()
wg.Wait()
Таким образом, вам даже не нужен сон, wg.Wait()
будет блокироваться, пока другая программа не вызовет wg.Done()
(что произойдет, только когда другая программа завершит свою работу).