Golang ist eine stark typisierte Programmiersprache mit einigen einzigartigen Funktionen. Eine davon ist Map, eine sehr praktische Datenstruktur in der Golang-Sprache. Obwohl die Karte leistungsstark ist, müssen wir in einigen Anwendungsszenarien tatsächlich nur „schreibgeschützte“ Vorgänge auf der Karte ausführen. Zu diesem Zeitpunkt müssen Sie einige Einschränkungen an der Karte vornehmen, um sie zu einer „schreibgeschützten“ Karte zu machen, die nur Lesevorgänge ausführen kann.
Warum brauchen wir einen schreibgeschützten Betrieb?
Tatsächlich kann es zu unvorhersehbaren Ergebnissen kommen, wenn mehrere Goroutinen gleichzeitig Karten lesen und schreiben. In diesem Fall ist die Karte nicht sicher und kann zu Datenfehlern oder sogar zum Absturz führen. Um die Sicherheit und Stabilität des Programms zu gewährleisten, müssen wir die Karte daher möglicherweise schreibgeschützt machen, um weitere Änderungen zu verhindern.
Wie erstelle ich eine schreibgeschützte Karte?
In Golang können wir sync.Map verwenden, um eine schreibgeschützte Karte zu erstellen. sync.Map ist eine gleichzeitig sichere Map-Implementierung. Seine Lese- und Schreibvorgänge sind atomar, sodass es threadsicher ist, wenn mehrere Goroutinen gleichzeitig lesen und schreiben. Der Unterschied zwischen sync.Map und gewöhnlicher Karte besteht darin, dass sowohl der Schlüssel- als auch der Werttyp interface{} sind, wodurch jede Art von Daten unterstützt werden kann.
Codebeispiel:
package main import ( "sync" "fmt" ) func main() { readOnlyMap := readOnlyMap() readOnlyMap.LoadOrStore("foo", "bar") fmt.Println(readOnlyMap.Load("foo")) readOnlyMap.Delete("foo") fmt.Println(readOnlyMap.Load("foo")) } func readOnlyMap() *sync.Map { m := &sync.Map{} return m }
Im obigen Beispiel können wir sehen, dass es eine Funktion namens readOnlyMap() gibt, die einen Zeiger vom Typ *sync.Map zurückgibt. Wir verwenden diese Funktion in der Hauptfunktion, um ein schreibgeschütztes sync.Map-Objekt zu erhalten.
Wir können die Funktion Load() verwenden, um den Wert in der schreibgeschützten Karte zu lesen, und Delete(), um ein Schlüssel-Wert-Paar zu löschen. Allerdings können wir die Store()-Funktion nicht verwenden, um ein neues Schlüssel-Wert-Paar zu schreiben.
Wie verwende ich eine schreibgeschützte Karte in Goroutine?
Ein Hauptmerkmal der Go-Sprache ist die Unterstützung der Parallelität. Wenn wir eine schreibgeschützte Karte zwischen mehreren Goroutinen teilen, müssen wir sicherstellen, dass sie in einer gleichzeitigen Umgebung sicher gelesen werden kann. Hierzu können wir sync.RWMutex zum Sperren verwenden. RWMutex ist eine Lese-/Schreibsperre in der Go-Sprache. Wir können damit den gegenseitigen Ausschluss von Lese- und Schreibvorgängen durchführen.
Codebeispiel:
package main import ( "sync" "fmt" ) func main() { var wg sync.WaitGroup readOnlyMap := readOnlyMap() readOnlyMap.LoadOrStore("foo", "bar") for i := 0; i < 100; i++ { wg.Add(1) go func() { defer wg.Done() readOnlyMapOperation(readOnlyMap, "foo") }() } wg.Wait() } func readOnlyMapOperation(m *sync.Map, key interface{}) interface{} { m.RLock() defer m.RUnlock() return m.Load(key) } func readOnlyMap() *sync.Map { m := &sync.Map{} return m }
Im obigen Beispiel verwenden wir ein schreibgeschütztes sync.Map-Objekt, um den Wert des Schlüssels „foo“ zu lesen. Wir haben 100 Goroutinen erstellt und jede Goroutine verwendete die Funktion readOnlyMapOperation(), um den Wert im sync.Map-Objekt zu lesen. Die Lese-/Schreibsperre sync.RWMutex wird in der Funktion readOnlyMapOperation() verwendet, um sicherzustellen, dass schreibgeschützte Vorgänge unter gleichzeitigen Bedingungen threadsicher sind.
Zusammenfassung
Die schreibgeschützte Karte ist eine sehr praktische Datenstruktur in der Go-Sprache. Sie kann sichere und effiziente Unterstützung bieten, wenn mehrere Goroutinen gleichzeitig gemeinsam genutzte Daten lesen. In tatsächlichen Anwendungen müssen wir den RWMutex-Lese-/Schreibsperrmechanismus im Code verstehen und bei Bedarf die richtigen Einschränkungen für die Karte vornehmen, um optimale Leistung und Sicherheit zu erreichen.
Das obige ist der detaillierte Inhalt vonSo erstellen Sie eine schreibgeschützte Karte in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!