Sobes.tech
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.