Golang Context

Вызов Golang Программирование и разработка

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

Context настолько полезен, что многие библиотеки в экосистеме go используют его. Вы также найдете их в приложениях, которые взаимодействуют с удаленными серверами, базами данных, вызовами API и многим другим.

В этой статье мы познакомим новичков с пакетом контекста в Go и расскажем, как использовать контекст для различных вариантов использования.

Контекст со значением

Одним из основных вариантов использования контекстов в Go является совместное использование данных или использование значений в области запроса. Пакет контекста Golang предоставляет вам функцию WithValue, которая позволяет вам обмениваться данными.

Синтаксис функции показан ниже:

func WithValue (родительский контекст, ключ, интерфейс val {}) Контекст

Функция принимает контекст, ключ и значение в качестве параметров. Затем функция создаст новый контекст на основе предоставленного родителя и добавит указанное значение к заданному ключу.

Думайте об этом как о внутреннем контексте с типом пары ключ-значение внутри. Затем вы можете получить или получить значения из типа.

Рассмотрим приведенный ниже пример, который иллюстрирует, как использовать функцию WithValue и извлекать из нее значения.

package main

import«fmt»
import«context»

funcmain() {
ctx := context.Background()
ctx = addValues(ctx)
retrieveValue(ctx)
}
funcaddValues(ctx context.Context) context.Context {
return context.WithValue(ctx, «key», «value»)
}
funcretrieveValue(ctx context.Context) {
value := ctx.Value(«key»)
fmt.Println(value)
}

Сосредоточьтесь на основной функции кода выше. Мы начинаем с создания нового объекта контекста, ctx, с помощью функции context.Background().

Затем фоновая функция вернет пустой контекст, отличный от nil, без отмен, значений и крайних сроков.

Фоновая функция служит для инициализации входящих запросов контекста.

Значения контекстного набора

Вторая часть функции — это функция addValues(). В этом примере мы берем новый контекст и привязываем его к существующему контексту. Новый контекст содержит ключ для добавления к контексту.

Обратите внимание, что функция WithValue возвращает копию родительского контекста и не изменяет существующий контекст.

Контекст получить значения

Вторая часть программы — это функция retrieveValue(). В этом случае мы берем структуру контекста и извлекаем значения, связанные с указанным ключом.

Если ключ существует в контексте, функция должна вернуть соответствующее значение.

Если ключ не существует, функция должна вернуть nil. Мы можем реализовать условную логику, чтобы проверить, является ли возвращаемое значение нулевым, и вернуть ошибку, если оно истинно.

Контекст с тайм-аутом

Другой распространенный вариант использования контекстов — обработка тайм-аутов. Например, вам может потребоваться определить время ожидания в определенных приложениях, если указанное действие не выполняется. Это невероятно просто реализовать с помощью функции WithTimeout из пакета context. Давайте посмотрим, как мы можем реализовать тайм-аут с помощью пакета контекста.

package main

import (
«context»
«fmt»
«time»
)

funcmain() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
ctx = addValues(ctx)
go retrieveValues(ctx)
select {
case<ctx.Done():
fmt.Println(«Took too long!»)
}
time.Sleep(5 * time.Second)
}

funcaddValues(ctx context.Context) context.Context {
return context.WithValue(ctx, «key», «value»)
}
funcretrieveValues(ctx context.Context) {
for {
select {
case<ctx.Done():
fmt.Println(«Timeout»)
return
default:
value := ctx.Value(«key»)
fmt.Println(value)
}
time.Sleep(1 * time.Second)
}
}

В этом примере мы определяем функцию отмены с помощью функции context.WithTimeout. Затем мы можем запустить функцию отмены вручную, если сочтем нужным.

По достижении значения тайм-аута вызывается функция отмены и выполняется указанная логика.

В нашей функции извлечения значения мы непрерывно извлекаем значение с указанным ключом, используя цикл for. Мы также проверяем, жив ли еще канал Done из основного контекста. Если время ожидания не истекло, родительский контекст все еще будет открыт, но по истечении времени ожидания контекст отменяется.

В нашем примере функция будет запускаться каждую 1 секунду до истечения времени ожидания. Пример вывода выглядит следующим образом:

value

value

value

value

value

Took too long!

Timeout

Заключение

Это был краткий и фундаментальный учебник, в котором обсуждались контексты и способы их использования в ваших программах Go. Вы можете проверить документацию, чтобы узнать больше о контекстах Go.

Читайте также:  Golang Errgroup
Оцените статью
bestprogrammer.ru
Добавить комментарий