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 deLen()-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 hetfalseterug.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 functiefwordt voor elk sleutel-waarde paar aangeroepen. Alsffalseretourneert, 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.