Ordre d'affectation dans Go Maps
Considérez le code Go suivant :
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) }
Le résultat est :
{40.68433 74.39967} map[Bell Labs:{40.68433 74.39967} test:{12 100}]
Cependant, si une modification mineure est apportée à la déclaration du sommet de test, en déplaçant la fermeture accolade quatre espaces vers la droite :
m["test"] = Vertex{ 12.0, 100, }
Le résultat devient :
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
La question se pose : Pourquoi cette légère modification affecte-t-elle l'ordre de la carte ?
Réponse :
L'ordre d'une carte dans Go dépend de la fonction de hachage sous-jacente utilisée. Cette fonction de hachage est randomisée pour atténuer les attaques par déni de service qui exploitent les collisions de hachage. Reportez-vous à l'outil de suivi des problèmes suivant pour plus d'informations :
http://code.google.com/p/go/issues/detail?id=2630
Il est important de noter que l'ordre des cartes n’est pas garanti par la spécification du langage. Bien que les implémentations Go actuelles maintiennent un ordre stable, les révisions futures pourraient compacter les cartes lors du garbage collection ou d'autres opérations, modifiant potentiellement l'ordre sans la modification explicite de la carte par le code. Par conséquent, il est déconseillé de s'appuyer sur un ordre spécifique pour les cartes.
Comme indiqué dans la spécification Go :
Une carte est un groupe non ordonné d'éléments d'un même type. , appelé type d'élément, indexé par un ensemble de clés uniques d'un autre type, appelé type de clé.
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!