Sobes.tech
Middle

Wat weet je over het pakket sync.Map?

sobes.tech AI

Antwoord van AI

De sync.Map-package biedt een thread-veilige hash-tabel. Het is geoptimaliseerd voor gevallen waarin sleutels voornamelijk worden gelezen en minder vaak worden geschreven.

Belangrijkste kenmerken:

  • Parallelle veiligheid: Garandeert veilige toegang vanuit meerdere goroutines zonder expliciete vergrendelingen.
  • Geoptimaliseerd voor lezen: Bij de eerste lezing van elke sleutel wordt een kopie in cache opgeslagen voor alleen-lezen. Latere lezingen uit deze cache vereisen geen vergrendeling.
  • Dynamisch verwijderen: Verwijderde elementen worden eerst gemarkeerd als verwijderd, en het daadwerkelijke verwijderen gebeurt onder bepaalde voorwaarden om vergrendelingen bij schrijven te minimaliseren.
  • Ontbreken van Len()-methode: Ondersteuning van de Len()-methode zou een parallel veilige implementatie complex en duur maken.
  • Niet geschikt voor voortdurend veranderende gegevens: Bij frequente schrijfacties en verwijderingen kan het minder efficiënt zijn dan het gebruik van een mutex met een gewone map.

Belangrijkste methoden:

  • Load(key any) (value any, ok bool): Laadt de waarde die met de sleutel is verbonden. Als de sleutel niet bestaat, geeft het false terug.
  • Store(key, value any): Slaat een waarde op voor de sleutel. Kan worden gebruikt voor toevoegen of bijwerken.
  • LoadOrStore(key any, value any) (actual any, loaded bool): Laadt de waarde die met de sleutel is verbonden als deze al bestaat. Anders slaat het de opgegeven waarde op. Geeft de feitelijke waarde en een vlag die aangeeft of de waarde is geladen (true) of opgeslagen (false).
  • Delete(key any): Verwijdert de waarde voor de sleutel.
  • Range(f func(key, value any) bool): Itereert over de elementen in de map in willekeurige volgorde. De functie f wordt voor elk sleutel-waarde paar aangeroepen. Als f false retourneert, stopt de iteratie.

Voorbeeld van gebruik:

import "sync"

var m sync.Map

func process(key string, value int) {
	m.Store(key, value)

	v, ok := m.Load(key)
	if ok {
		// Gebruik v
	}

	m.Range(func(key, value any) bool {
		// Verwerk elementen
		return true // Ga door met iteratie
	})
}

Over het algemeen is sync.Map een goede keuze wanneer parallelle lezingen aanzienlijk de schrijfacties en verwijderingen overtreffen. Anders kan het gebruik van map met sync.Mutex of sync.RWMutex geschikter zijn.