Back to questions
Senior
6
Расскажите про виды контекстов в Go: Background, WithTimeout, WithCancel и другие.
Companies where asked
Алабуга
Answer from AI
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")
}
Таким образом, контексты позволяют контролировать время жизни операций, отменять их и передавать данные между горутинами, что особенно важно для сетевых запросов и долгих вычислений.