Реализуйте потокобезопасный кэш «ключ-значение». Нагрузка в основном на чтение: примерно 95% операций приходится на Get, остальные 5% на Set и Delete. Реализацию стоит подобрать под такой профиль.
type Cache struct { /* ... */ }
func NewCache() *Cache
func (c *Cache) Set(key string, value interface{})
func (c *Cache) Get(key string) (interface{}, bool)
func (c *Cache) Delete(key string)
Пример:
c := NewCache()
c.Set("a", 1)
v, ok := c.Get("a") // 1, true
c.Set("a", 2) // перезапись
c.Delete("a")
v, ok = c.Get("a") // nil, false
c.Delete("a") // повторное удаление не ошибка
Требования:
Get возвращает значение и true, если ключ есть, иначе nil, false.
Set перезаписывает существующее значение.
Delete отсутствующего ключа безопасен.
NewCache возвращает готовый к работе кэш.
- Доступ из множества горутин одновременно без гонок под
-race.
Тесты запускают 8 пишущих и 64 читающих горутины по 2000 операций и проверяют, что гонок нет, а кэш остаётся рабочим. Выбор между Mutex и RWMutex тесты не проверяют, но по условию (95% чтений) ждут от вас именно осознанного выбора, и на собеседовании про него спросят.
Сначала попробуй сам — подсказки не дают готовый ответ.