Trier les valeurs Go map par clés
Lors de l'itération à travers la carte retournée dans le code, retournée par la fonction topic, les clés n'apparaissent pas dans l'ordre.
Comment puis-je obtenir les clés pour être dans l'ordre / trier la carte afin que les clés soient dans l'ordre et que les valeurs correspondent?
Voici le code .
2 réponses
Le Aller blog: Allez les cartes dans l'action est une excellente explication.
Lors de l'itération sur une carte avec une boucle de plage, l'ordre d'itération est non spécifié et n'est pas garanti pour être le même à partir d'une itération pour la prochaine. Depuis Go 1, le runtime randomise l'ordre d'itération de la carte, comme les programmeurs se sont appuyés sur l'ordre d'itération stable du précédent application. Si vous avez besoin d'un ordre d'itération stable vous devez maintenir une structure de données distincte qui spécifie cette commande.
Voici ma version modifiée de l'exemple de code: http://play.golang.org/p/dvqcGPYy3-
package main
import (
"fmt"
"sort"
)
func main() {
// To create a map as input
m := make(map[int]string)
m[1] = "a"
m[2] = "c"
m[0] = "b"
// To store the keys in slice in sorted order
var keys []int
for k := range m {
keys = append(keys, k)
}
sort.Ints(keys)
// To perform the opertion you want
for _, k := range keys {
fmt.Println("Key:", k, "Value:", m[k])
}
}
Sortie:
Key: 0 Value: b
Key: 1 Value: a
Key: 2 Value: c
Selon la spécification Go , l'ordre d'itération sur une carte n'est pas défini et peut varier entre les exécutions du programme. En pratique, non seulement il est indéfini, mais il est en fait intentionnellement randomisé. C'est parce qu'il était prévisible, et les développeurs de langage Go ne voulaient pas que les gens se fient à un comportement non spécifié, donc ils l'ont intentionnellement randomisé pour qu'il soit impossible de s'appuyer sur ce comportement.
Ce que vous aurez à faire, alors, est de tirer les clés dans une tranche, triez-les, puis passez sur la tranche comme ceci:
var m map[keyType]valueType
keys := sliceOfKeys(m) // you'll have to implement this
for _, k := range keys {
v := m[k]
// k is the key and v is the value; do your computation here
}