Intern
Είναι ασφαλές να διαβάζετε χάρτες με ασφάλεια σε Go;
sobes.tech AI
Απάντηση από AI
Στη γλώσσα Go, η ανάγνωση από ένα map δεν είναι ασφαλής για νήματα αν πραγματοποιείται ταυτόχρονα και εγγραφή. Για ασφαλή ανάγνωση σε περιβάλλον πολλαπλών νημάτων, πρέπει να χρησιμοποιηθεί συγχρονισμός, π.χ., sync.RWMutex για κλείδωμα ανάγνωσης και εγγραφής, ή sync.Map, το οποίο έχει σχεδιαστεί ειδικά για ταυτόχρονη πρόσβαση.
Παράδειγμα με sync.RWMutex:
import (
"sync"
)
var (
m = make(map[string]int)
mu sync.RWMutex
)
func read(key string) (int, bool) {
mu.RLock() // κλείδωμα ανάγνωσης
defer mu.RUnlock() // απελευθέρωση
val, ok := m[key]
return val, ok
}
func write(key string, val int) {
mu.Lock() // κλείδωμα εγγραφής
defer mu.Unlock() // απελευθέρωση
m[key] = val
}
Ή χρησιμοποιήστε το sync.Map:
import "sync"
var m sync.Map
func read(key string) (interface{}, bool) {
return m.Load(key)
}
func write(key string, val interface{}) {
m.Store(key, val)
}
Το sync.Map είναι βολικό όταν υπάρχουν πολλές ανταγωνιστικές λειτουργίες, αλλά έχει ιδιαιτερότητες στην απόδοση και το API.