Ответ
Интерфейс context.Context
в Go предназначен для передачи дедлайнов, сигналов отмены и других значений между API и процессами. Он определяет четыре основных метода:
Deadline() (deadline time.Time, ok bool)
— возвращает время, когда работа, связанная с этим контекстом, должна быть отменена. Если дедлайн не установлен,ok
будетfalse
.Done() <-chan struct{}
— возвращает канал, который закрывается, когда работа, связанная с этим контекстом, отменяется (по таймауту, дедлайну или вручную). Если контекст никогда не отменяется, канал может бытьnil
.Err() error
— возвращает ошибку, объясняющую причину отмены контекста. Если каналDone()
еще не закрыт,Err()
вернетnil
. Возможные ошибки:context.Canceled
(явная отмена) илиcontext.DeadlineExceeded
(превышение времени ожидания).Value(key interface{}) interface{}
— возвращает значение, связанное с данным контекстом по ключу, илиnil
, если такого значения нет. Используется для передачи данных, специфичных для запроса, таких как ID пользователя или токен трассировки.
Пример использования для отмены долгой операции:
func longOperation(ctx context.Context) {
select {
case <-time.After(5 * time.Second): // Имитация долгой работы
fmt.Println("Операция успешно завершена")
case <-ctx.Done(): // Ожидание сигнала отмены
fmt.Println("Операция отменена:", ctx.Err())
}
}
func main() {
// Создаем контекст с таймаутом в 2 секунды
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel() // Важно вызывать cancel, чтобы освободить ресурсы
longOperation(ctx)
// Вывод: Операция отменена: context deadline exceeded
}