Sobes.tech
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 metoda Len() 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 map obiș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ția f este apelată pentru fiecare pereche cheie-valoare. Dacă f returnează 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ă.