Thread‑safe in‑memory cache with Get/Set operations

Оберните map в структуру с mutex и защищайте все обращения. Для строк возвращаемое значение не требует глубокой копии, а bool отличает отсутствие ключа от пустой строки.

Короткий ответ

Что ответить на собеседовании

Оберните map в структуру с mutex и защищайте все обращения. Для строк возвращаемое значение не требует глубокой копии, а bool отличает отсутствие ключа от пустой строки.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать потокобезопасный вариант интерфейса Cache.

type Cache interface {
    Set(key, value string)
    Get(key string) (value string, ok bool)
}

Ответ

Оберните map в структуру с mutex и защищайте все обращения. Для строк возвращаемое значение не требует глубокой копии, а bool отличает отсутствие ключа от пустой строки.

С импортом sync:

type MemoryCache struct {
    mu sync.RWMutex
    items map[string]string
}
func (c *MemoryCache) Set(key, value string) {
    c.mu.Lock()
    defer c.mu.Unlock()
    if c.items == nil { c.items = make(map[string]string) }
    c.items[key] = value
}
func (c *MemoryCache) Get(key string) (string, bool) {
    c.mu.RLock()
    defer c.mu.RUnlock()
    value, ok := c.items[key]
    return value, ok
}
var _ Cache = (*MemoryCache)(nil)

Нулевое значение структуры пригодно к работе. После использования экземпляр нельзя копировать. TTL, вытеснение и максимальный объём памяти этим минимальным интерфейсом пока не определены.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее