Ordenar un tipo de mapa en Go

Una de las peculiaridades de un mapa Go es que los campos regresan en un orden aleatorio.

Si ejecuta este simple ejemplo:

package main

import ( “fmt” )

func main() { ages := map[string]int{ “a”: 1, “c”: 3, “d”: 4, “b”: 2, }

<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">ages</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">ages</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">ages</span>)

}

tocar

la salida será

map[b:2 a:1 c:3 d:4]
map[c:3 d:4 b:2 a:1]
map[d:4 b:2 a:1 c:3]

Esto es a propósito, para evitar depender del orden de los elementos, ya que diferentes implementaciones del compilador pueden usar diferentes funciones hash. Es una de esas cosas que hacen que Go sea muy explícito para evitar causar suposiciones inválidas.

¿Qué pasa si desea pedir un mapa por clave?

package main

import ( “fmt” “sort” )

func main() { ages := map[string]int{ “a”: 1, “c”: 3, “d”: 4, “b”: 2, }

<span style="color:#a6e22e">names</span> <span style="color:#f92672">:=</span> make([]<span style="color:#66d9ef">string</span>, <span style="color:#ae81ff">0</span>, len(<span style="color:#a6e22e">ages</span>))

<span style="color:#66d9ef">for</span> <span style="color:#a6e22e">name</span> <span style="color:#f92672">:=</span> <span style="color:#66d9ef">range</span> <span style="color:#a6e22e">ages</span> {
	<span style="color:#a6e22e">names</span> = append(<span style="color:#a6e22e">names</span>, <span style="color:#a6e22e">name</span>)
}

<span style="color:#a6e22e">sort</span>.<span style="color:#a6e22e">Strings</span>(<span style="color:#a6e22e">names</span>) <span style="color:#75715e">//sort keys alphabetically

for _, name := range names { fmt.Println(ages[name]) }

}

tocar

Este programa imprimirá los valores del mapa, ordenados por clave:

1
2
3
4

Más tutoriales de go: