Ordenar valores de mapa por claves

Al iterar a través del mapa devuelto en el código, devuelto por la función de tema, las claves no aparecen en orden.

¿Cómo puedo obtener las claves en orden / ordenar el mapa para que las claves estén en orden y correspondan los valores?

Aquí está el código .

El blog Go: Ir a los mapas en acción tiene una excelente explicación.

Cuando se itera sobre un mapa con un bucle de rango, el orden de iteración no se especifica y no se garantiza que sea el mismo de una iteración a la siguiente. Desde Go 1, el tiempo de ejecución aleatoriza el orden de iteración del mapa, ya que los progtwigdores se basaron en el orden de iteración estable de la implementación anterior. Si necesita una orden de iteración estable, debe mantener una estructura de datos separada que especifique esa orden.

Aquí está mi versión modificada del código de ejemplo: 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]) } } 

Salida:

 Key: 0 Value: b Key: 1 Value: a Key: 2 Value: c 

De acuerdo con la especificación Go , el orden de iteración sobre un mapa no está definido, y puede variar entre ejecuciones del progtwig. En la práctica, no solo no está definido, sino que está intencionalmente aleatorizado. Esto se debe a que solía ser predecible, y los desarrolladores del lenguaje Go no querían que las personas dependieran de un comportamiento no especificado, por lo que lo aleatorizaron de manera intencional, por lo que confiar en este comportamiento era imposible.

Lo que tendrá que hacer, entonces, es tirar de las llaves en una rebanada, ordenarlas y luego extenderlas sobre la porción de esta manera:

 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 }