Ответ
Основная проблема асинхронного вывода в Go — это race condition (гонка данных) при конкурентном доступе к общим ресурсам (например, stdout). Без синхронизации вывод может перемешиваться.
Пример:
func main() {
for i := 0; i < 10; i++ {
go func() {
fmt.Print(i) // Гонка данных: i и вывод могут перемешаться
}()
}
time.Sleep(time.Second)
}
Решение:
- Использовать мьютексы (
sync.Mutex) - Каналы для синхронизации
sync.WaitGroupдля ожидания завершения горутин
Пример с WaitGroup:
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(x int) {
defer wg.Done()
fmt.Print(x)
}(i)
}
wg.Wait()
}