Middle
Mida teate sync.Map paketist?
sobes.tech AI
Vastus AI-lt
sync.Map pakett nodrošina paralēli drošu hašatabeli. Tas ir optimizēts gadījumiem, kad atslēgas galvenokārt tiek lasītas un retāk rakstītas.
Galvenās īpašības:
- Paralēla drošība: Nodrošina drošu piekļuvi no vairākiem gorutīniem bez skaidriem bloķējumiem.
- Optimizēts lasīšanai: Pirmo reizi lasot katru atslēgu, tā tiek kešota tikai lasīšanai paredzētā kopijā. Nākamie lasījumi no šīs kešatmiņas neprasa bloķēšanu.
- Dinamiska dzēšana: Dzēstie elementi vispirms tiek atzīmēti kā dzēsti, un patiesā dzēšana notiek noteiktos apstākļos, lai samazinātu rakstīšanas bloķējumus.
- Trūkst
Len()metodes: AtbalstsLen()metodei padarītu paralēli drošu realizāciju sarežģītu un dārgu. - Nepiemērots pastāvīgi mainīgiem datiem: Bieži rakstot un dzēšot, tas var būt mazāk efektīvs nekā parasta
maparsync.Mutexvaisync.RWMutex.
Galvenās metodes:
Load(key any) (value any, ok bool): Ielādē saistīto vērtību ar atslēgu. Ja atslēga nav, atgriežfalse.Store(key, value any): Saglabā vērtību ar atslēgu. Var izmantot pievienošanai vai atjaunināšanai.LoadOrStore(key any, value any) (actual any, loaded bool): Ielādē saistīto vērtību, ja tā jau pastāv. Pretējā gadījumā saglabā norādīto vērtību. Atgriež faktisko vērtību un zīmi, vai vērtība tika ielādēta (true) vai saglabāta (false).Delete(key any): Dzēš vērtību ar atslēgu.Range(f func(key, value any) bool): Iterē pa elementiem nejaušā secībā. Funkcijaftiek izsaukta katrai atslēgas-vērtības pāri. Jafatgriežfalse, iterācija tiek pārtraukta.
Piemērs lietošanai:
import "sync"
var m sync.Map
func process(key string, value int) {
m.Store(key, value)
v, ok := m.Load(key)
if ok {
// Izmantojam v
}
m.Range(func(key, value any) bool {
// Apstrādājam elementus
return true // Turpinām iterāciju
})
}
Kopumā, sync.Map ir labs izvēle, kad paralēli lasījumi ievērojami pārsniedz rakstus un dzēšanas. Pretējā gadījumā, map lietošana kopā ar sync.Mutex vai sync.RWMutex var būt piemērotāka.