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.