Ответ
Используйте каналы или контекст для управления горутинами. Основные подходы:
- Канал для остановки:
done := make(chan struct{})
go func() {
for {
select {
case <-done:
return
default:
// работа
}
}
}()
// Остановка
close(done)
- context.Context:
ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
// работа
}
}
}(ctx)
// Остановка
cancel()
- sync.WaitGroup для ожидания завершения:
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// работа
}()
wg.Wait()
Ключевые моменты:
- Всегда предусматривайте механизм остановки
- Убедитесь, что горутина не останется "висеть"
- Используйте defer для очистки ресурсов
- Для сложных сценариев комбинируйте подходы