Sobes.tech
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 може бити погодније.