Middle
Co wiesz o pakiecie sync.Map?
sobes.tech AI
Odpowiedź od AI
Pakiet sync.Map zapewnia bezpieczną dla wątków tablicę haszową. Jest zoptymalizowany dla przypadków, gdy klucze są głównie odczytywane i rzadziej zapisywane.
Główne cechy:
- Bezpieczeństwo równoległe: Zapewnia bezpieczny dostęp z wielu gorutyn bez jawnych blokad.
- Optymalizacja pod kątem odczytu: Pierwsze odczytanie każdego klucza jest buforowane jako tylko do odczytu. Kolejne odczyty z tego bufora nie wymagają blokady.
- Dynamiczne usuwanie: Usunięte elementy są najpierw oznaczane jako usunięte, a rzeczywiste usunięcie następuje pod określonymi warunkami, aby zminimalizować blokady podczas zapisu.
- Brak metody
Len(): Obsługa metodyLen()uczyniłaby równoległą implementację skomplikowaną i kosztowną. - Nie nadaje się do danych zmieniających się stale: Przy częstych zapisach i usunięciach może być mniej wydajny niż użycie mutexa z zwykłą mapą.
Główne metody:
Load(key any) (value any, ok bool): Ładuje wartość powiązaną z kluczem. Jeśli klucz nie istnieje, zwracafalse.Store(key, value any): Zapisuje wartość dla klucza. Może być używany do dodawania lub aktualizacji.LoadOrStore(key any, value any) (actual any, loaded bool): Ładuje wartość powiązaną z kluczem, jeśli już istnieje. W przeciwnym razie zapisuje wskazaną wartość. Zwraca faktyczną wartość i flagę wskazującą, czy wartość została załadowana (true) lub zapisana (false).Delete(key any): Usuwa wartość dla klucza.Range(f func(key, value any) bool): Iteruje po elementach w mapie w dowolnej kolejności. Funkcjafjest wywoływana dla każdej pary klucz-wartość. Jeślifzwracafalse, iteracja się kończy.
Przykład użycia:
import "sync"
var m sync.Map
func process(key string, value int) {
m.Store(key, value)
v, ok := m.Load(key)
if ok {
// Użyj v
}
m.Range(func(key, value any) bool {
// Przetwarzaj elementy
return true // Kontynuuj iterację
})
}
Ogólnie, sync.Map jest dobrym wyborem, gdy równoległe odczyty znacznie przewyższają zapisy i usunięcia. W przeciwnym razie, użycie map z sync.Mutex lub sync.RWMutex może być bardziej odpowiednie.