Fix "не следует использовать базовую строку типа в качестве ключа в контексте. WallValue" golint
Я передаю uuid при использовании Context
и WithValue
для последующих функций, которые обрабатывают этот *http.request
. Этот uuid передается в заголовке авторизации на вызов REST для идентификации человека. Маркер авторизации проверяется и должен быть доступен для проверки, разрешен ли сам вызов.
Я использовал:
ctx := context.WithValue(r.Context(), string("principal_id"), *id)
Но голинт жалуется:
should not use basic type string as key in context.WithValue
Каков наилучший вариант, который можно было бы использовать для извлечения этого ключа, который не является базовым типом, как простая строка?
Ответы
Ответ 1
Просто используйте тип ключа:
type key int
const (
keyPrincipalID key = iota
// ...
)
Поскольку вы определили отдельный тип, он никогда не столкнется. Даже если у вас есть два пакета, pkg1.key(0) != pkg2.key(0)
.
См. также: Перейти в блог о ключевых столкновениях в контексте.
Ответ 2
В то время как ответ Ainar концептуально правильный, вот решение, которое я нашел более гибким для моего конкретного случая: https://medium.com/@matryer/context-keys-in-go-5312346a868d#.rvtbo2tei
Например, проверьте, как он использует authTokenFromContext (ctx). Ницца!