Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Где и как применяеться gorilla/context?

Здравствуйте. Объясните пожалуйста, в каких случаях нужно использовать этот пакет и зачем он нужен?


Ответ

Пришел к тебе запрос (может с внешнего сервиса, с браузера или, может, от части твоей же собственной программы, неважно). Была вызвана какая-то функциюядля обработки, та вызвала еще, та еще, та еще. И где-то там в глубине нужно принять решение - что ответить на запрос. Или, возможно, пора уже отказаться и оборвать (по таймауту например), или тебя снаружи не захотели столько ждать и связь оборвали и тебе не нужно обрабатывать. В контекст складывается вся информация, которая нужна для обработки, для принятия решения. Иногда - там же обрывается соединение. Но прежде всего контекст - это куча информации. Как правило эту информацию может в контекст положить самая первая, верхняя функция - обязательно. Вложенные функции - могут дополнять контекст. Где-то в самом низу, в самой глубоко вложенной функции тебе как на блюдечке в контексте лежит куча информации для принятия решения. Можно это делать и просто прокидыванием переменных внутрь. Но с каждым уровнем число переменным может возростать. Контекст - не то чтобы заведомо удобнее, но всяко-разно универсальнее. Хотя для простых случаев я бы обошелся без него. С ним все таки не очень удобно. Например, типичным для контекстов является сохранение значений в map[string]interface{}, что лишает тебя возможности проверки типов на этапе компиляции. Так что в простых случаях можно обойтись без этого, вместо контекста использовать переменные вполне определенные и вполне определенных типов - будет надежнее работать. Но в сложных случаях этих переменных будет слишком много, они могут быть разных типов, не все из них будут всегда использоваться, поэтому вариант map[string]interface{} и используется зачастую. В случае с /x/net/context - это используются интерфейсы, что делает его вроде менее очевидным, но более типобезопасным. В статье https://habrahabr.ru/post/269299/ описано немного какие есть альтернативные представления контекстов. Все они - проще для понимания, более тривиальны, подобны обычному map[string]interface{}. Но этот контекст хоть и более мозгодробительный, но более надежный, так как часть ошибок вылавливает компилятор. Типичное использование в веб-приложениях к примеру (можно и не только в веб-приложениях, но это я к примеру) - изначально кладем туда данные запроса, лучше слегка обработанные. "/api/v1/labuda/123" - например RESTful API - получение labuda #123 - кладем в контекст объект Labuda{}, на следующем уровня в контекст вкладывается объект DatabaseConnection, а в самом низу извлекаем данные пользуясь DatabaseConnection и кладем их в Labuda{}, результат так же через контекст возвращается наверх.

Комментариев нет:

Отправить комментарий