Проверяет опыт работы с in-memory.
Оборачивайте критические секции мьютексом так, чтобы проверка и запись были атомарны. Используйте sync.RWMutex для разделения чтения/записи, избегайте «глобальной» блокировки на всё, если возможно — дробите на более мелкие замки.
Проблема: гонки при параллельных запросах (check-then-act).
Приёмы:
RWMutex: многие читатели, единственный писатель;
«тонкий» лок вокруг минимально необходимого участка;
инкапсуляция коллекций, чтобы никто не модифицировал их без блокировки.
Пример (упрощённо):
type Repo struct {
mu sync.RWMutex
items map[string]Order
}
func (r *Repo) Get(id string) (Order, bool) {
r.mu.RLock(); defer r.mu.RUnlock()
o, ok := r.items[id]
return o, ok
}
func (r *Repo) Create(o Order) error {
r.mu.Lock(); defer r.mu.Unlock()
if _, exists := r.items[o.ID]; exists {
return ErrDuplicate
}
r.items[o.ID] = o
return nil
}Антипаттерн: «взяли глобальный Lock() в начале метода и держим до конца везде».
Вывод: блокируйте там, где нужна атомарность; разделяйте чтение и запись.