Sobes.tech
Назад к вопросам
Senior
7

Расскажите про виды контекстов в Go: Background, WithTimeout, WithCancel и другие.

Компании, где спрашивали
Алабуга

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

sobes.tech AI

В Go пакет context используется для управления временем жизни запросов, отмены операций и передачи значений между горутинами.

Основные виды контекстов:

  • context.Background() — базовый, пустой контекст, обычно используется как корневой контекст в приложении.
  • context.TODO() — временный контекст, когда еще не определено, какой именно использовать.
  • context.WithCancel(parent) — создает новый контекст, который можно отменить вручную вызовом функции cancel(). Отмена распространяется на все дочерние контексты.
  • context.WithTimeout(parent, duration) — создает контекст с автоматической отменой через заданный таймаут.
  • context.WithDeadline(parent, time) — аналогично WithTimeout, но с конкретной датой и временем окончания.
  • context.WithValue(parent, key, value) — создает контекст с привязанным значением, которое можно получить в дочерних контекстах.

Пример использования с таймаутом и отменой:

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

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

Таким образом, контексты позволяют контролировать время жизни операций, отменять их и передавать данные между горутинами, что особенно важно для сетевых запросов и долгих вычислений.