Оберните map в структуру с mutex и защищайте все обращения. Для строк возвращаемое значение не требует глубокой копии, а bool отличает отсутствие ключа от пустой строки.
Thread‑safe in‑memory cache with Get/Set operations
Оберните 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, вытеснение и максимальный объём памяти этим минимальным интерфейсом пока не определены.