Для чего завершать горутину через контекст

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

Ответ

Завершение горутин через контекст (context.Context) — это идиоматический способ управления их жизненным циклом в Go. Контекст позволяет:

  1. Грациозно завершать горутины при отмене операции (например, HTTP-запроса или таймаута)
  2. Распространять отмену по цепочке вызовов
  3. Избегать утечек горутин при прерывании работы

Пример:

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 и др.).