Как завершить все горутины

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

Ответ

В Go нет прямого способа завершить горутины извне. Рекомендуется использовать каналы или контексты для graceful shutdown:

func worker(stopCh <-chan struct{}) {
    for {
        select {
        case <-stopCh:
            return // завершаем горутину
        default:
            // работа
        }
    }
}

func main() {
    stopCh := make(chan struct{})
    go worker(stopCh)

    // когда нужно завершить
    close(stopCh) // сигнал всем горутинам
}

Или с context:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            return
        default:
            // работа
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // завершение
    cancel()
}

Важно: горутины должны сами проверять сигналы завершения. Можно использовать sync.WaitGroup для ожидания завершения.