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
mapiləsync.Mutexvə yasync.RWMutexistifadə 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ə,falseqaytarı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 (truevə yafalse).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.ffunksiyası hər bir açar-dəyər cütlüyü üçün çağırılır. Əgərffalseqaytarı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.