Sobes.tech
Назад к вопросам
Junior
17

Что такое контекст в Go? Для чего нужен, какие бывают виды, какие паттерны работы с ним существуют?

Компании, где спрашивали
Позитив Технолоджис

Ответ от нейросети

sobes.tech AI

В Go контекст (package context) — это механизм для передачи сигналов отмены, дедлайнов и других значений между горутинами.

Для чего нужен:

  • Управление временем жизни операций (например, отмена HTTP-запроса при таймауте).
  • Передача сквозных данных (например, идентификаторы запросов для логирования).

Виды контекста:

  • context.Background() — корневой, пустой контекст.
  • context.TODO() — используется, когда контекст еще не определен.
  • Контексты с отменой (WithCancel), с таймаутом (WithTimeout), с дедлайном (WithDeadline), с значениями (WithValue).

Паттерны работы:

  • Передавать контекст первым параметром в функции.
  • Не хранить контекст в структурах, а передавать явно.
  • Проверять отмену через <-ctx.Done().

Пример:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
 defer cancel()

select {
case <-time.After(time.Second * 10):
    fmt.Println("operation finished")
case <-ctx.Done():
    fmt.Println("operation cancelled or timed out")
}