Heim >Backend-Entwicklung >Golang >Änderung der Golang-Synchronisierungskarte
Ich bin kürzlich auf ein Problem mit dem Typ sync.Map gestoßen, als ich die Go-Sprache verwendet habe: wie man die darin enthaltenen Daten ändert, insbesondere in einer gleichzeitigen Umgebung. Hier möchte ich mein Verständnis und meine Lösung mitteilen.
Der sync.Map-Typ in der Go-Sprache ist eine threadsichere Map, die in einer gleichzeitigen Umgebung verwendet werden kann. Die Verwendung ist sehr einfach. Sie können eine sync.Map-Variable über den folgenden Code definieren:
var m sync.Map
Als nächstes können Sie Elemente über die Load- und Store-Methoden lesen und schreiben, zum Beispiel: #🎜🎜 #
m.Store("key1", "value1") v, ok := m.Load("key1")Was bei diesem Prozess beachtet werden muss, ist, dass der erste Parameter der Store-Methode der Schlüssel ist, der zweite Parameter der Wert ist und der Rückgabewert der Load-Methode zwei hat, der erste ist der Wert. der Zweite Ist ein Wert vom Typ Bool, der angibt, ob der Schlüssel gefunden wird. Aber was ist, wenn wir ein Element in sync.Map ändern müssen? Der Wert kann nicht wie beim gewöhnlichen Kartentyp direkt über den Index geändert werden. Werfen wir einen Blick darauf, was in der offiziellen Dokumentation von Go zu Änderungen steht:
It must not be copied after first use. To avoid ownership issues, values stored in the Map should not be modified.In der Dokumentation heißt es, dass die Werte in sync.Map nicht geändert werden sollten. Dies liegt daran, dass Map ein Referenztyp ist. Wenn wir ihn ändern, kann dies Auswirkungen auf andere Coroutinen haben und zu Race Conditions und Dateninkonsistenzen führen. Was sollen wir also tun, wenn wir ein vorhandenes Schlüssel-Wert-Paar ändern möchten? Tatsächlich können wir die Range-Methode innerhalb des sync.Map-Typs verwenden, um zuerst die Elemente zu lesen, die durch diese Methode geändert werden müssen, und dann einen neuen Wert neu zu schreiben. Der Beispielcode lautet wie folgt:
m.Range(func(key, value interface{}) bool { if key == "key1" { m.Store(key, "newvalue") } return true })Hier durchlaufen wir zunächst die gesamte Map mit der Range-Methode und ermitteln dann, ob der zu ändernde Schlüssel vorhanden ist. Wenn er vorhanden ist, schreiben Sie einen neuen Wert über die Store-Methode neu. Es ist zu beachten, dass der Durchlaufvorgang angehalten wird, wenn die Range-Methode „false“ zurückgibt. Abschließend müssen wir zusammenfassen:
Das obige ist der detaillierte Inhalt vonÄnderung der Golang-Synchronisierungskarte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!