Middle
Šta znaš o paketu sync.Map?
sobes.tech АИ
Одговор од АИ
Пакет sync.Map обезбеђује безбедну за паралелни приступ хеш табелу. Он је оптимизован за случајеве када су кључеви углавном читани и ређе записивани.
Главне особине:
- Паралелна безбедност: Гарантује безбедан приступ из више горутина без експлицитних блокирања.
- Оптимизовано за читање: При првом читању сваког кључа, кешира се копија само за читање. Следећа читања из тог кеша не захтевају блокирање.
- Динамично брисање: Избрисани елементи се најпре означавају као избрисани, а стварно брисање се дешава под одређеним условима како би се минимизирали блокирања при запису.
- Недостаје метода
Len(): Подршка заLen()би учинила паралелно безбедну имплементацију сложенијом и скупљом. - Није погодан за стално мењање података: Са честим записима и брисањима, може бити мање ефикасан од коришћења мютекса са обичном
map.
Главне методе:
Load(key any) (value any, ok bool): Учитава вредност повезану са кључем. Ако кључ не постоји, враћаfalse.Store(key, value any): Складишти вредност за кључ. Може се користити за додавање или ажурирање.LoadOrStore(key any, value any) (actual any, loaded bool): Учитава вредност повезану са кључем ако она већ постоји. У супротном, чува наведену вредност. Враћа стварну вредност и флаг који указује да ли је вредност учитана (true) или сачувана (false).Delete(key any): Брише вредност за кључ.Range(f func(key, value any) bool): Итерира кроз елементе у мапи у произвољном реду. Функцијаfсе позива за сваки пар кључ-вредност. Акоfвратиfalse, итерација се зауставља.
Пример употребе:
import "sync"
var m sync.Map
func process(key string, value int) {
m.Store(key, value)
v, ok := m.Load(key)
if ok {
// Користите v
}
m.Range(func(key, value any) bool {
// Обрада елемената
return true // Наставити итерацију
})
}
Уопштено, sync.Map је добар избор када паралелно читање значајно превазилази записе и брисања. У супротном, коришћење map са sync.Mutex или sync.RWMutex може бити погодније.