Ответ
Завершение горутин через контекст (context.Context) — это идиоматический способ управления их жизненным циклом в Go. Контекст позволяет:
- Грациозно завершать горутины при отмене операции (например, HTTP-запроса или таймаута)
- Распространять отмену по цепочке вызовов
- Избегать утечек горутин при прерывании работы
Пример:
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Worker stopped via context")
return
default:
// Работа
}
}
}
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
//...
cancel() // Сигнал на завершение
Ключевые преимущества перед каналами: стандартизация, вложенность контекстов и интеграция с stdlib (HTTP, gRPC и др.).