Тип ключа для context.WithValue
Вопрос
Почему ключ для context.WithValue советуют делать своим неэкспортируемым типом, а не строкой?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Строки как ключи нельзя сравнивать через ==
- Свой тип исключает коллизию ключей разных пакетовправильный ответ
- Поиск по своему типу идёт по хешу, а не линейно
- WithValue принимает в качестве ключа только struct
Разбор
Ключи сравниваются как интерфейсы. Строку "user" может использовать любой пакет и случайно перезаписать или прочитать чужое значение. Неэкспортируемый тип type ctxKey struct{} доступен только своему пакету, коллизия невозможна, а доступ дают функции WithUser(ctx, u), UserFrom(ctx). Скорость тут ни при чём: поиск всё равно линейный по цепочке. Тип ключа может быть любым сравнимым, но встроенные типы (string, int) не рекомендуются в документации WithValue.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.