Какие методы определяет интерфейс `context.Context` в Go?

Ответ

Интерфейс 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
}