Ordre d'affectation dans les cartes
Dans Go, les cartes sont des collections non ordonnées de paires clé-valeur. Cependant, le résultat de l'extrait de code suivant semble suggérer un ordre pour les paires clé-valeur :
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) }
Lorsque l'extrait de code ci-dessus est exécuté, il génère :
{40.68433 74.39967} map[Bell Labs:{40.68433 74.39967} test:{12 100}]
Cependant, si l'espace autour de l'accolade droite dans l'affectation de la touche "test" est modifié, la sortie changements :
m["test"] = Vertex{ 12.0, 100, }
Avec cette modification, le résultat devient :
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
Explication
Le comportement observé est dû à la randomisation de Fonction de hachage de carte de Go. Cette randomisation est mise en œuvre pour empêcher les attaques par déni de service qui exploitent les collisions de hachage. Comme indiqué dans le suivi des problèmes Go :
http://code.google.com/p/go/issues/detail?id=2630
L'ordre des cartes n'est pas garanti dans Go. Bien que les implémentations actuelles ne réorganisent pas explicitement les cartes, les implémentations futures pourraient compacter les cartes lors du GC ou d'autres opérations, affectant potentiellement l'ordre. Par conséquent, il n'est pas judicieux de se fier à l'ordre des cartes dans votre code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!