Sobes.tech
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 metody Len() 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, zwraca false.
  • 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. Funkcja f jest wywoływana dla każdej pary klucz-wartość. Jeśli f zwraca false, 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.