Heim >Backend-Entwicklung >Golang >Warum scheint die Kartenausgabe von Go geordnet zu sein, obwohl die Karten ungeordnet sind?
Zuweisungsreihenfolge in Karten
In Go sind Karten ungeordnete Sammlungen von Schlüssel-Wert-Paaren. Die Ausgabe des folgenden Codeausschnitts scheint jedoch eine Reihenfolge für die Schlüssel-Wert-Paare vorzuschlagen:
package main import "fmt" type Vertex struct { Lat, Long float64 } var m map[string]Vertex func main() { m = make(map[string]Vertex) m["Bell Labs"] = Vertex{ 40.68433, 74.39967, } m["test"] = Vertex{ 12.0, 100, } fmt.Println(m["Bell Labs"]) fmt.Println(m) }
Wenn der obige Codeausschnitt ausgeführt wird, wird Folgendes ausgegeben:
{40.68433 74.39967} map[Bell Labs:{40.68433 74.39967} test:{12 100}]
Wenn jedoch das Leerzeichen um die rechte geschweifte Klammer in der Belegung der Taste „test“ geändert wird, wird die Ausgabe Änderungen:
m["test"] = Vertex{ 12.0, 100, }
Mit dieser Änderung lautet die Ausgabe:
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
Erklärung
Das beobachtete Verhalten ist auf die Randomisierung von zurückzuführen Gos Karten-Hash-Funktion. Diese Randomisierung wird implementiert, um Denial-of-Service-Angriffe zu verhindern, die Hash-Kollisionen ausnutzen. Wie im Go Issue Tracker angegeben:
http://code.google.com/p/go/issues/detail?id=2630
Die Kartenreihenfolge ist in Go nicht garantiert. Obwohl aktuelle Implementierungen Karten nicht explizit neu anordnen, können zukünftige Implementierungen Karten während der GC oder anderen Vorgängen komprimieren, was möglicherweise Auswirkungen auf die Reihenfolge hat. Daher ist es unklug, sich in Ihrem Code auf die Kartenreihenfolge zu verlassen.
Das obige ist der detaillierte Inhalt vonWarum scheint die Kartenausgabe von Go geordnet zu sein, obwohl die Karten ungeordnet sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!