Heim >Backend-Entwicklung >Golang >Änderung der Golang-Synchronisierungskarte

Änderung der Golang-Synchronisierungskarte

WBOY
WBOYOriginal
2023-05-10 09:30:06786Durchsuche

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:

    Der Wert des sync.Map-Typs kann nicht geändert werden. Wenn wir einen Wert aktualisieren möchten, sollten wir ihn abrufen Durch die Range-Methode wird dieser Wert dann mit einem neuen Wert neu geschrieben.
  1. Bei der Verwendung von sync.Map müssen Sie auf Probleme bei der Parallelitätsverarbeitung achten, um Dateninkonsistenzen und andere Probleme zu vermeiden.
Ich hoffe, dieser Artikel wird Ihnen hilfreich sein. Wenn es etwas Unangemessenes gibt, geben Sie mir bitte einen Rat!

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Golang-Liste zu JSONNächster Artikel:Golang-Liste zu JSON