Sobes.tech
Middle

sync.Map paketi haqqında nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

sync.Map paketi, çoxnəfərli təhlükəsiz bir hash cədvəli təmin edir. Əsasən, açarların oxunması daha çox, yazılması isə daha az olan hallara optimallaşdırılmışdır.

Əsas xüsusiyyətlər:

  • Çoxnəfərli təhlükəsizlik: Açıqlıq olmadan bir neçə goroutine-dən təhlükəsiz giriş təmin edir.
  • Oxuma üçün optimallaşdırılmış: Hər bir açarın ilk oxunuşu üçün yalnız oxumaq üçün kopyası yaddaşa alınır. Bu cache-dən sonrakı oxumalar kilid tələb etmir.
  • Dinamik silmə: Silinmiş elementlər əvvəlcə silinmiş kimi işarələnir və real silmə müəyyən şərtlər altında həyata keçirilir ki, yazma zamanı kilidləri minimuma endirəsin.
  • Len() metodu yoxdur: Len() metodunun dəstəyi paralel təhlükəsiz tətbiqi mürəkkəb və bahalı edərdi.
  • Daimi dəyişən məlumatlar üçün uyğun deyil: Tez-tez yazma və silmə ilə, adi map ilə sync.Mutex və ya sync.RWMutex istifadə etmək daha uyğun ola bilər.

Əsas metodlar:

  • Load(key any) (value any, ok bool): Açar ilə əlaqəli dəyəri yükləyir. Əgər açar mövcud deyilsə, false qaytarır.
  • Store(key, value any): Açar üçün dəyər saxlayır. Əlavə və ya yeniləmək üçün istifadə edilə bilər.
  • LoadOrStore(key any, value any) (actual any, loaded bool): Əgər açar artıq mövcuddursa, əlaqəli dəyəri yükləyir. Əks halda, göstərilən dəyəri saxlayır. Faktiki dəyəri və yüklənib-yüklənmədiyini göstərən bayrağı qaytarır (true və ya false).
  • Delete(key any): Açar üçün dəyəri silir.
  • Range(f func(key, value any) bool): Elementlər üzərində istənilən sırayla iterasiya edir. f funksiyası hər bir açar-dəyər cütlüyü üçün çağırılır. Əgər f false qaytarırsa, iterasiya dayanır.

İstifadə nümunəsi:

import "sync"

var m sync.Map

func process(key string, value int) {
	m.Store(key, value)

	v, ok := m.Load(key)
	if ok {
		// v ilə işləyin
	}

	m.Range(func(key, value any) bool {
		// Elementləri emal edin
		return true // İterasiyanı davam etdirin
	})
}

Ümumiyyətlə, sync.Map çoxlu oxuma əməliyyatlarının yazma və silmə əməliyyatlarından əhəmiyyətli dərəcədə üstün olduğu hallarda yaxşı seçimdir. Əks halda, map ilə sync.Mutex və ya sync.RWMutex istifadə etmək daha uyğun ola bilər.