sync.Map — это concurrent-safe реализация ассоциативного массива (словаря) из пакета sync, предназначенная для использования в высококонкурентных сценариях.
Основные сценарии применения:
var m sync.Map
// Сохранение значения
m.Store("key", "value")
// Получение значения
value, ok := m.Load("key")
// Удаление
m.Delete("key")
// Атомарное обновление
m.LoadOrStore("key", "default") // Загружает или сохраняет
// Перебор элементов
m.Range(func(key, value interface{}) bool {
fmt.Println(key, value)
return true // false для прерывания
})
var userSessions sync.Map
func handleRequest(userID string) {
// Атомарное создание сессии при необходимости
session, _ := userSessions.LoadOrStore(userID, NewSession())
// Использование сессии
sess := session.(Session) // Приведение типа
sess.DoSomething()
// Периодическая очистка старых сессий
userSessions.Range(func(key, value interface{}) bool {
if value.(Session).Expired() {
userSessions.Delete(key)
}
return true
})
}
sync.Map использует:
| Характеристика | sync.Map | map + RWMutex | concurrent-map |
|---|---|---|---|
| Блокировки чтения | Нет | RLock | Нет |
| Производительность | Высокая | Средняя | Высокая |
| Типизация | Нет | Да | Да (генрики) |
| Стандартная либа | Да | Да | Нет |
Что такое sync.Map
Потокобезопасная реализация словаря из стандартной библиотеки Go
Когда использовать
Основные методы
Альтернативы
sync.Map — мощный инструмент для специфических сценариев, но не универсальная замена обычным map.