Middle
Was weißt du über das Paket sync.Map?
sobes.tech KI
Antwort von AI
Das Paket sync.Map stellt eine threadsichere Hashtabelle bereit. Es ist für Anwendungsfälle optimiert, bei denen Schlüssel hauptsächlich gelesen und seltener geschrieben werden.
Hauptmerkmale:
- Parallel-Sicherheit: Gewährleistet sicheren Zugriff von mehreren Goroutines ohne explizite Sperren.
- Optimiert für Lesezugriffe: Beim ersten Lesen eines Schlüssels wird eine Kopie für den Nur-Lese-Zugriff zwischengespeichert. Weitere Lesezugriffe aus diesem Cache erfordern keine Sperre.
- Dynamisches Löschen: Gelöschte Elemente werden zunächst als gelöscht markiert, und die tatsächliche Löschung erfolgt unter bestimmten Bedingungen, um Sperren beim Schreiben zu minimieren.
- Fehlende
Len()-Methode: Die Unterstützung derLen()-Methode würde eine parallele sichere Implementierung komplex und teuer machen. - Nicht geeignet für ständig wechselnde Daten: Bei häufigen Schreib- und Löschvorgängen kann es weniger effizient sein als die Verwendung eines Mutex mit einer normalen
map.
Hauptmethoden:
Load(key any) (value any, ok bool): Lädt den Wert, der mit dem Schlüssel verbunden ist. Wenn der Schlüssel nicht vorhanden ist, wirdfalsezurückgegeben.Store(key, value any): Speichert einen Wert für den Schlüssel. Kann zum Hinzufügen oder Aktualisieren verwendet werden.LoadOrStore(key any, value any) (actual any, loaded bool): Lädt den Wert, der mit dem Schlüssel verbunden ist, wenn er bereits existiert. Andernfalls speichert es den angegebenen Wert. Gibt den tatsächlichen Wert und einen booleschen Wert zurück, der angibt, ob der Wert geladen (true) oder gespeichert (false) wurde.Delete(key any): Löscht den Wert für den Schlüssel.Range(f func(key, value any) bool): Iteriert über die Elemente in der Map in beliebiger Reihenfolge. Die Funktionfwird für jedes Schlüssel-Wert-Paar aufgerufen. Wennffalsezurückgibt, wird die Iteration beendet.
Beispiel:
import "sync"
var m sync.Map
func process(key string, value int) {
m.Store(key, value)
v, ok := m.Load(key)
if ok {
// v verwenden
}
m.Range(func(key, value any) bool {
// Elemente verarbeiten
return true // Fortsetzen der Iteration
})
}
Insgesamt ist sync.Map eine gute Wahl, wenn parallele Lesezugriffe die Schreib- und Löschvorgänge deutlich überwiegen. Andernfalls kann die Verwendung eines map mit sync.Mutex oder sync.RWMutex geeigneter sein.