Heim  >  Artikel  >  Backend-Entwicklung  >  Ist die Golang-Karte bestellt?

Ist die Golang-Karte bestellt?

王林
王林Original
2023-05-13 11:32:08692Durchsuche

In vielen Programmiersprachen ist die Kartendatenstruktur eine sehr verbreitete Datenstruktur, die normalerweise aus Schlüsseln und Werten besteht. In verschiedenen Programmiersprachen können sich die Implementierung und das Verhalten der Zuordnung jedoch geringfügig unterscheiden. In Go ist eine Karte ein allgemeiner Datentyp, der als Hash-Tabelle implementiert ist und als Karte bezeichnet wird.

Ich glaube, dass viele Entwickler, die neu in der Golang-Sprache sind, sehr neugierig sind, wie die Kartendatenstruktur von Go implementiert wird, ob sie geordnet ist und ob sie Thread-sicher ist. Daher wird Ihnen dieser Artikel ausführliche Informationen geben Verständnis dafür, ob die Golang-Karte bestellt ist.

Einführung in Golang Map

In der Golang-Sprache ist Map ein sehr nützlicher Datentyp, der zum Speichern von Schlüssel-Wert-Paardaten verwendet werden kann. Die Implementierung von Map basiert auf einer Hash-Tabelle, was bedeutet, dass ein Element in konstanter Zeit abgerufen oder geändert werden kann, sodass es sehr schnell und effizient ist.

Hier ist ein Beispiel für die Verwendung einer Karte zum Speichern von E-Mail-Adressen:

emailMap := map[string]string{
    "john@example.com": "John",
    "jane@example.com": "Jane",
    "bob@example.com":  "Bob",
}

Im obigen Beispiel haben wir ein Kartenobjekt zum Speichern von E-Mail-Adressen und entsprechenden Benutzernamen verwendet. Wir können den Wert über den Schlüssel erhalten, wie unten gezeigt:

fmt.Println(emailMap["john@example.com"]) // Output: John

Wie Sie sehen können, haben wir den entsprechenden Wert John über emailMap["john@example.com"] erhalten.

Durchquerung der Golang-Karte

In Golang können wir das Schlüsselwort „range“ verwenden, um eine Karte zu durchqueren. Der Beispielcode lautet wie folgt:

for k, v := range emailMap {
    fmt.Printf("%s: %s
", k, v)
}

Im obigen Code stellt k den Schlüssel und v den Wert dar, den wir verwenden können Führen Sie bei Bedarf die entsprechende Aktion aus.

Ist die Golang-Karte geordnet?

Nach dem Testen und der tatsächlichen Verwendung ist die Golang-Karte ungeordnet, was bedeutet, dass Sie die Reihenfolge der in der Karte gespeicherten Elemente nicht garantieren können. Mit anderen Worten: Wenn Sie Elemente in einer bestimmten Reihenfolge zu einer Karte hinzufügen, bedeutet dies nicht, dass sie in derselben Reihenfolge gespeichert oder in derselben Reihenfolge durchlaufen werden.

Um dies zu demonstrieren, können wir den folgenden Beispielcode verwenden:

emailMap := map[string]string{
    "john@example.com": "John",
    "jane@example.com": "Jane",
    "bob@example.com":  "Bob",
}

for k, v := range emailMap {
    fmt.Printf("%s: %s
", k, v)
}

Wenn wir diesen Code mehrmals ausführen, werden wir feststellen, dass die Reihenfolge der Ausgabeelemente zufällig ist.

Der Grund für diese ungeordnete Eigenschaft ist, dass Golang Map als Hash-Tabelle implementiert ist. Eine Hash-Tabelle ist eine Erweiterung einer Hash-Tabelle. Sie verwendet eine Hash-Funktion, um Schlüssel bestimmten Positionen im Array zuzuordnen. Wenn die Kartenelemente mithilfe einer Hash-Funktion in einem Array gespeichert werden, werden sie nicht in ihrer Reihenfolge sortiert.

Methoden zur Lösung der Unordnung der Golang-Karte

Obwohl die Golang-Karte ungeordnet ist, können wir dies durch einige Hacks erreichen, wenn wir eine geordnete Karte benötigen.

Methode 1: Struktursortierung verwenden

Sie können die Schlüssel/Wert-Paare in der Karte in Strukturabschnitte umwandeln, dann die Funktion des Sortierpakets verwenden, um die Strukturabschnitte zu sortieren, und sie schließlich zurück in die Karte übertragen. Der Beispielcode lautet wie folgt:

type kv struct {
    Key   string
    Value string
}

var ss []kv
for k, v := range emailMap {
    ss = append(ss, kv{k, v})
}

sort.Slice(ss, func(i, j int) bool {
    return ss[i].Key > ss[j].Key
})

for _, kv := range ss {
    fmt.Printf("%s: %s
", kv.Key, kv.Value)
}

Im obigen Code definieren wir zunächst eine Struktur namens kv, die zwei Felder enthält, nämlich Schlüssel und Wert. Dann haben wir ein kv-Slice namens ss definiert und die Schlüssel-Wert-Paare in der Map in Strukturen im Slice umgewandelt. Als nächstes haben wir die Slices durch Aufrufen der Funktion sort.Slice sortiert und schließlich eine Schleife verwendet, um die Slices auszugeben. Wertepaare.

Methode 2: Verwenden Sie die geordnete Kartenbibliothek

Zur Erleichterung für Entwickler gibt es viele Bibliotheken von Drittanbietern, die geordnete Karten implementieren können, z. B. go-ordered-map und orderedmap. Mithilfe dieser Bibliotheken können Sie geordnete Karten problemlos implementieren, ohne den oben genannten Hack zu verwenden.

Thread-Sicherheit von Golang Map

Wenn mehrere Goroutinen gleichzeitig auf Map zugreifen, können Kartendaten beschädigt werden oder verloren gehen. Daher müssen Sie bei der Verwendung von Map in Golang auf die Thread-Sicherheit achten.

Um dieses Problem zu lösen, stellt Golang das Sync-Paket zur Verfügung, in dem die Typen Mutex und RWMutex zur Steuerung des Goroutine-Zugriffs verwendet werden können. Das Folgende ist ein Beispiel für die Verwendung von Mutex zur Implementierung der Map-Thread-Sicherheit:

type SafeMap struct {
    mu sync.Mutex
    m  map[string]string
}

func (sm *SafeMap) Get(key string) (string, bool) {
    sm.mu.Lock()
    defer sm.mu.Unlock()

    v, ok := sm.m[key]
    return v, ok
}

func (sm *SafeMap) Set(key, value string) {
    sm.mu.Lock()
    defer sm.mu.Unlock()

    sm.m[key] = value
}

Im obigen Code definieren wir eine Struktur namens SafeMap, die einen Mutex und eine Map enthält. Die Get-Funktion verwendet Mutex, um den Zugriff auf die Map zu steuern. Die Set-Funktion sperrt auch die Map und führt dann entsprechende Vorgänge aus, bevor sie sie entsperrt.

Zusammenfassung

Karte in Golang ist ein sehr verbreiteter und praktischer Datentyp, der es uns ermöglicht, Schlüssel-Wert-Paardaten einfach zu speichern und darauf zuzugreifen. Obwohl die Golang-Karte ungeordnet ist, kann mit einigen Tricks eine geordnete Karte erreicht werden. Wenn mehrere Goroutinen gleichzeitig Map betreiben, müssen sie auf ihre Thread-Sicherheit achten, was durch Mutex und RWMutex des Synchronisierungspakets erreicht werden kann.

Das obige ist der detaillierte Inhalt vonIst die Golang-Karte bestellt?. 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-Typ-KonvertierungspaketNächster Artikel:Golang-Typ-Konvertierungspaket