Разбираемся с контекстами в Go

Этот пост является конспектом моего видео про контексты: Я заметил, что тема контекстов в языке Go у многих почему-то вызывает сложности с пониманием. Возможно, это связано с тем, что контекст — это очень абстрактная сущность и не встречается в других языках программирования в таком виде, по крайней мере в тех языках, что довелось использовать мне. В общем, я решил написать материал по данной теме с примерами и лучшими практиками. Вам будет легче понять то, о чем я буду рассказывать, если вы уже знакомы с основами языка Go, в частности знаете, что такое горутины и каналы. Что такое контекст? Если мы взглянем на документацию к пакету context, то первый абзац будет таким: Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes. Пакет context определяет тип Context, который позволяет управлять дедлайнами, сигналами отмены и другими значениями области действия запросов между границами API и процессами. Что это, чёрт побери, значит? А значит это примерно следующее: Контекст — это объект, который предназначен в первую очередь для того, чтобы иметь возможность отменить извне выполнение потенциально долгой операции. Кроме того, с помощью контекста можно хранить и передавать информацию между функциями и методами внутри вашей программы. Отменять долгие операции с помощью контекста можно несколькими способами: По явному сигналу отмены (context.WithCancel) По истечению промежутка времени (context.WithTimeout) По наступлению временной отметки или дедлайна (context.WithDeadline) Пример. Столик в ресторане Вы хотите забронировать столик в ресторане. Для этого вы набираете ресторан, и ждете, пока на той стороне возьмут трубку. Далее происходит одно из двух: Сотрудник ресторана берёт трубку. В таком случае вы начинаете диалог — всё хорошо; На той стороне никто не берёт трубку в течение минуты, двух, трёх…...

December 5, 2021  9 min