Такие читатели, как вы, помогают поддерживать MUO. Когда вы совершаете покупку по ссылкам на нашем сайте, мы можем получать партнерскую комиссию. Читать далее.

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

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

Контекстный пакет

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

instagram viewer

Вот как вы можете импортировать пакет контекста в свой Программы Go.

Импортировать"контекст"

Контекстные функции принимают Контекст тип структуры контекстного пакета. Традиционно вы должны использовать ctx как имя переменной экземпляра.

функцияоперации(контекст ctx. контекст) {
}

Функции могут возвращать тип структуры Context для других функций и операций.

функцияоперации(контекст ctx. контекст)контекст.Контекст {
}

Вы можете создать новый контекст с помощью ДЕЛАТЬ функция контекстного пакета. Функция TODO создает новый контекст со значением контекст. Сделанный(), канал, который будет закрыт при отмене контекста. Вы должны использовать его в качестве заполнителя, когда вам нужен контекст, но родительские контексты не подходят.

Импортировать"контекст"

функцияосновной() {
ctx := контекст. ДЕЛАТЬ()
}

Альтернативно, Фон Функция создает новый контекст без значения и пустой канал Done.

ctx := контекст. Фон()

Вы должны использовать функцию Background в качестве корня контекстного дерева.

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

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

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

Вот пример передачи контекста через функции с помощью пакета context.

Импортировать (
"контекст"
)

функцияценный контекст(контекст ctx. контекст)контекст.Контекст {
возвращаться контекст. Со значением (ctx, "ключ доступа", "hfouneqcelkwfu")
}

функцияполучитьконтекстдата(контекст ctx. контекст)любой {
ключ доступа := ctx. Ценить("ключ доступа")
возвращаться ключ доступа
}

ценный контекст функция принимает экземпляр контекста и возвращает экземпляр контекста для следующей функции. Экземпляр контекста — это значение, созданное с помощью Со значением метод. Метод WithValue берет экземпляр контекста из функции и пару ключ-значение.

Чтобы получить данные из контекста, вам нужно создать новый контекст с ДЕЛАТЬ или Фон функцию и передать контекст функции (в данном случае, ценный контекст) и получить контекст с получитьконтекстдата функция.

функцияосновной() {
ctx := контекст. Фон()
ctx = ценный контекст (ctx)
ФМТ. Println (receiveContextData (ctx))

}

Переменная ctx — это экземпляр контекста из фоновой функции. Функция valueContext принимает переменную ctx и возвращает контекст со значением, которое принимает функция receiveContextData и возвращает значение из пары ключ-значение.

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

контекст Пакет предоставляет функциональные возможности для установки тайм-аутов и крайних сроков в операциях. Установка тайм-аутов и крайних сроков полезна для операций, которые необходимо наверстать упущенное.

Тайм-ауты — это продолжительность времени, которое занимает операция. Вы можете установить тайм-аут для операции на 4 секунды; после этого контекст отменяет запрос.

С другой стороны, крайний срок определяет абсолютную точку, в которой операция должна быть отменена.

Вы можете использовать С таймаутом метод для установки тайм-аута контекста. Вот как вы можете установить 2-секундный тайм-аут.

функцияосновной() {
ctx, отмена := контекст. С таймаутом (контекст. Фон(), 2 * время. Второй)
отложить отмена()

// какая-то операция
}

основной Функция создает контекст с тайм-аутом в две секунды. Функция WithTimeout возвращает функцию отмены, которую вы можете отложить для отмены при выходе из основной функции.

Вы можете объявить сроки с Со сроком метод. Метод WithDeadline принимает экземпляр контекста и крайний срок.

функциясделай что-нибудь(контекст ctx. контекст) {
Крайний срок: = время. Сейчас().Добавить(1500 * время. Миллисекунда)
ctx, ctxCancel := контекст. WithDeadline (ctx, крайнее время)
отложить ctxCancel()

// какая-то операция

ctxCancel()
}

сделай что-нибудь функция принимает контекст, а Крайний срокВремя переменная – время до контекст крайний срок. ctx переменная — это контекст с дедлайном.

ctxCancel переменная отменяет контекст, когда контекст превышает свой крайний срок.

Лучшие практики использования контекстов в Go

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

Наконец, используйте контексты как сигналы, а не гарантии. Отмена контекста не гарантирует, что все горутины перестанут работать; это просто сигнал, а горутины не зависят от контекста.