Страницы

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

суббота, 13 июля 2019 г.

Объясните смысл Context в Go

Здравствуйте, уже второй день пытаюсь въехать в Context, который практически везде используется в Go. Но не могу понять, для чего именно и какой смысл в его использовании. Статьи не помогают, походу я совсем безнадежен.


Ответ

Контекст - это просто сборник мета-данных, ассоциированных с каким-то запросом. Простейший пример - HTTP-запросы. Контекст пришедшего в HTTP-хендлер запроса отменяется, когда разрывается TCP-соединение. Предположим, ваш HTTP-хендлер делает какую-то сложную работу в цикле. Перед хендлером стоит промежуточный слой (middleware), которая берёт находит пользователя, например по куки, и кладёт в контекст запроса. Итоговый хендлер может выглядеть так:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() user := userFromContext(ctx) if user == nil { http.Error(w, "no user", http.StatusBadRequest) return }
for i := 0; i < N; i++ { select { case <-ctx.Done(): log.Printf("request cancelled: %v", ctx.Err()) return default: }
doSomethingSlow(i, user) } })

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

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