Middle
Ce știi despre pachetul sync.Map?
sobes.tech AI
Răspuns de la AI
Pachetul sync.Map oferă o tabel hash sigur pentru accesul concurent. Este optimizat pentru cazurile în care cheile sunt citite în principal și scrise mai rar.
Caracteristici principale:
- Siguranță în paralel: Asigură acces sigur din mai multe goroutines fără blocări explicite.
- Optimizat pentru citire: La prima citire a fiecărei chei, se cachează o copie pentru citire. Citirile ulterioare din acest cache nu necesită blocare.
- Ștergere dinamică: Elementele șterse sunt mai întâi marcate ca șterse, iar ștergerea reală are loc sub anumite condiții pentru a minimiza blocările în timpul scrierii.
- Lipsa metodei
Len(): Suportul pentru metodaLen()ar face implementarea sigură pentru paralelism complexă și costisitoare. - Nu este potrivit pentru date în continuă schimbare: Cu scrieri și ștergeri frecvente, poate fi mai puțin eficient decât utilizarea unui mutex cu un
mapobișnuit.
Metode principale:
Load(key any) (value any, ok bool): Încarcă valoarea asociată cu cheia. Dacă cheia nu există, returneazăfalse.Store(key, value any): Salvează o valoare pentru cheie. Poate fi utilizat pentru adăugare sau actualizare.LoadOrStore(key any, value any) (actual any, loaded bool): Încarcă valoarea asociată cu cheia dacă aceasta există deja. În caz contrar, salvează valoarea specificată. Returnează valoarea efectivă și un indicator dacă valoarea a fost încărcată (true) sau salvată (false).Delete(key any): Șterge valoarea pentru cheie.Range(f func(key, value any) bool): Iterează peste elemente în ordine arbitrară. Funcțiafeste apelată pentru fiecare pereche cheie-valoare. Dacăfreturneazăfalse, iterația se oprește.
Exemplu de utilizare:
import "sync"
var m sync.Map
func process(key string, value int) {
m.Store(key, value)
v, ok := m.Load(key)
if ok {
// Folosește v
}
m.Range(func(key, value any) bool {
// Procesează elemente
return true // Continuă iterația
})
}
În general, sync.Map este o alegere bună atunci când citirile paralele depășesc semnificativ scrierile și ștergerile. În caz contrar, utilizarea unui map cu sync.Mutex sau sync.RWMutex poate fi mai potrivită.