РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1364 of 1593 menu

Интерфейс context.Context

Интерфейс context.Context является фундаментальным механизмом в Go для управления жизненным циклом операций, выполняющихся в горутинах. Он предоставляет возможность передачи сигналов отмены, установки дедлайнов и таймаутов, а также передачи данных между функциями и горутинами. Контекст обычно создается в корневых функциях и передается вниз по цепочке вызовов, обеспечивая единое управление для всех связанных операций.

Основными методами интерфейса являются Deadline, который возвращает время, когда контекст должен быть отменен, Done, который возвращает канал, закрываемый при отмене контекста, Err, возвращающий причину отмены, и Value, позволяющий получать значения по ключу.

Синтаксис

Интерфейс context.Context определяется следующими методами:

type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key any) any }

Пример с базовым использованием

Давайте создадим контекст с таймаутом и проверим его методы:

package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() deadline, ok := ctx.Deadline() if ok { fmt.Println("Deadline:", deadline.Format("15:04:05")) } }

Результат выполнения кода:

"Deadline: 14:35:12"

Пример с отменой контекста

Покажем, как использовать метод Done для получения сигнала отмены:

package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) go func() { select { case <-ctx.Done(): fmt.Println("Context cancelled") fmt.Println("Error:", ctx.Err()) } }() time.Sleep(100 * time.Millisecond) cancel() time.Sleep(100 * time.Millisecond) }

Результат выполнения кода:

"Context cancelled" "Error: context canceled"

Пример с передачей данных

Используем метод Value для передачи данных через контекст:

package main import ( "context" "fmt" ) type key string func main() { ctx := context.WithValue(context.Background(), key("userID"), 12345) value := ctx.Value(key("userID")) fmt.Println("User ID:", value) }

Результат выполнения кода:

"User ID: 12345"

Пример с проверкой ошибки

Метод Err возвращает ошибку после отмены контекста:

package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() time.Sleep(2 * time.Second) err := ctx.Err() fmt.Println("Context error:", err) }

Результат выполнения кода:

"Context error: context deadline exceeded"

Смотрите также

  • функцию context.Background,
    которая возвращает пустой корневой контекст
  • функцию context.WithTimeout,
    которая создает контекст с таймаутом
  • функцию context.WithCancel,
    которая создает контекст с функцией отмены
  • функцию context.WithValue,
    которая добавляет данные в контекст
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить