Какие известные виды контекстов существуют в Go?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Go стандартный пакет context предоставляет несколько функций для создания контекстов:
-
context.Background(): Возвращает непустой контекст, который обычно используется в качестве корневого контекста для начала выполнения программы. Он никогда не отменяется, не имеет крайнего срока и не несет никаких значений. -
context.TODO(): Возвращает непустой контекст. Используется, когда вы точно не знаете, какой контекст использовать, или когда функция еще не обновлена для приема контекста. ПодобноBackground(), он никогда не отменяется, не имеет крайнего срока и не несет значений. Это временный заполнитель. -
context.WithCancel(parent Context): Возвращает производный контекст, который может быть отменен с помощью возвращаемой функцииcancel. Отмена этого контекста освобождает ресурсы, связанные с ним и его дочерними элементами.// Создание контекста с отменой ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Отмена контекста при выходе из функции // Использование ctx... -
context.WithDeadline(parent Context, deadline time.Time): Возвращает производный контекст, который будет отменен автоматически в указанное времяdeadline. Также возвращает функциюcancel, которая может быть вызвана раньше для отмены.// Создание контекста с крайним сроком deadline := time.Now().Add(5 * time.Second) ctx, cancel := context.WithDeadline(context.Background(), deadline) defer cancel() // Использование ctx... -
context.WithTimeout(parent Context, timeout time.Duration): ПодобноWithDeadline, но принимает продолжительность времени. Возвращает производный контекст, который будет отменен автоматически по истечении указанногоtimeout.// Создание контекста с таймаутом ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() // Использование ctx... -
context.WithValue(parent Context, key, val any): Возвращает производный контекст, который несет указанную пару ключ/значение. Используется для передачи данных, специфичных для запроса, через API.// Создание контекста с значением type userIDKey string ctx := context.WithValue(context.Background(), userIDKey("user_id"), 123) // Получение значения из контекста if userID, ok := ctx.Value(userIDKey("user_id")).(int); ok { // использовать userID }
Эти функции позволяют строить иерархию контекстов, где дочерние контексты наследуют свойства от родительских и могут быть отменены независимо или при отмене родителя.