Выбор ответа Middle context обновлено

Тип ключа для context.WithValue

Вопрос

Почему ключ для context.WithValue советуют делать своим неэкспортируемым типом, а не строкой?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Свой тип исключает коллизию ключей разных пакетов. Ключи сравниваются как интерфейсы.

Варианты ответа

  1. Строки как ключи нельзя сравнивать через ==
  2. Свой тип исключает коллизию ключей разных пакетовправильный ответ
  3. Поиск по своему типу идёт по хешу, а не линейно
  4. WithValue принимает в качестве ключа только struct

Разбор

Ключи сравниваются как интерфейсы. Строку "user" может использовать любой пакет и случайно перезаписать или прочитать чужое значение. Неэкспортируемый тип type ctxKey struct{} доступен только своему пакету, коллизия невозможна, а доступ дают функции WithUser(ctx, u), UserFrom(ctx). Скорость тут ни при чём: поиск всё равно линейный по цепочке. Тип ключа может быть любым сравнимым, но встроенные типы (string, int) не рекомендуются в документации WithValue.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.