Ответ
Пакет context в Go предназначен для управления отменой операций, установкой дедлайнов и передачей данных, специфичных для запроса, через границы API и между горутинами.
Существует несколько основных способов создания и использования контекстов:
-
context.Background()— это корневой, пустой контекст. Он никогда не отменяется, не имеет значений и дедлайнов. Обычно используется вmain(), при инициализации или в тестах как отправная точка для создания других контекстов.ctx := context.Background() -
context.TODO()— также пустой контекст, который следует использовать, когда вы не уверены, какой контекст применить, или если функция будет доработана для его получения в будущем. Служит как временная "заглушка".ctx := context.TODO() -
context.WithCancel(parent)— создает дочерний контекст, который можно отменить вручную. Возвращает контекст и функциюcancel(). Вызов этой функции отменяет данный контекст и все производные от него.ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Важно всегда вызывать cancel, чтобы освободить ресурсы -
context.WithTimeout(parent, timeout)— создает контекст, который автоматически отменяется по истечении заданногоtimeout.ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() -
context.WithDeadline(parent, time)— похож наWithTimeout, но отмена происходит в конкретный момент времени (time), а не через интервал.deadline := time.Now().Add(2 * time.Hour) ctx, cancel := context.WithDeadline(context.Background(), deadline) defer cancel() -
context.WithValue(parent, key, value)— позволяет передавать данные внутри контекста. Важно: этот способ следует использовать с осторожностью, в основном для передачи опциональных, сквозных данных (например, ID трассировки, токен аутентификации), а не обязательных параметров функции, так как это делает API неявным.type key string const userIDKey key = "userID" ctx := context.WithValue(context.Background(), userIDKey, 123)