Sobes.tech
Junior — Middle

Είναι δυνατόν να διαβάσετε με ασφάλεια δεδομένα από μια δομή δεδομένων map χωρίς τον κίνδυνο σφαλμάτων;

sobes.tech AI

Απάντηση από AI

Στα Go, η ανάγνωση από ένα map είναι ασφαλής αν κανείς δεν το αλλάζει εκείνη τη στιγμή. Ωστόσο, αν παράλληλα γίνεται εγγραφή (προσθήκη, διαγραφή ή αλλαγή στοιχείων), η ανάγνωση μπορεί να οδηγήσει σε panic (σφάλμα εκτέλεσης).

Για ασφαλή ανάγνωση από ένα map σε περιβάλλον πολλαπλών νημάτων, συνήθως χρησιμοποιούνται:

  • sync.RWMutex — για το κλείδωμα του map κατά την εγγραφή και την επιτρεπτή παράλληλη ανάγνωση
  • sync.Map — μια εξειδικευμένη, ασφαλής δομή δεδομένων για maps

Παράδειγμα με RWMutex:

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
}

Έτσι, η ασφαλής ανάγνωση είναι δυνατή αν διασφαλιστεί ο συγχρονισμός με την εγγραφή.