Как контролировать жизненный цикл горутины

«Как контролировать жизненный цикл горутины» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Используйте каналы или контекст для управления горутинами. Основные подходы:

  1. Канал для остановки:
done := make(chan struct{})
go func() {
    for {
        select {
        case <-done:
            return
        default:
            // работа
        }
    }
}()
// Остановка
close(done)
  1. context.Context:
ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            return
        default:
            // работа
        }
    }
}(ctx)
// Остановка
cancel()
  1. sync.WaitGroup для ожидания завершения:
var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()
    // работа
}()
wg.Wait()

Ключевые моменты:

  • Всегда предусматривайте механизм остановки
  • Убедитесь, что горутина не останется "висеть"
  • Используйте defer для очистки ресурсов
  • Для сложных сценариев комбинируйте подходы