Iterando sobre todas las teclas de un mapa

316

¿Hay alguna manera de obtener una lista de todas las claves en un mapa de idioma Go? El número de elementos viene dado por len(), pero si tengo un mapa como:

m := map[string]string{ "key1":"val1", "key2":"val2" };

¿Cómo itero sobre todas las claves?

Martin Redmond
fuente

Respuestas:

546

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

o

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}

Ir a las especificaciones del lenguaje para las fordeclaraciones especifica que el primer valor es la clave, la segunda variable es el valor, pero no tiene que estar presente.

Jonathan Feinberg
fuente
22
Como posible problema, tenga en cuenta que el orden de la iteración no está definido. groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna
23
Sudhir: la especificación del lenguaje golang define explícitamente los mapas como que tienen un orden indefinido de claves. Además, desde Go 1, el orden de las teclas se aleatoriza intencionalmente entre ejecuciones para evitar la dependencia de cualquier orden percibido.
Mark Renouf
66
Tenga en cuenta que esta no es una iteración mutable, es decir, eliminar una clave requerirá que reinicie la iteración.
Rick Smith
También para conjuntos de datos pequeños, el orden de los mapas podría ser predecible.
woot
14

Aquí hay una manera fácil de obtener slicelas teclas del mapa.

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}
a8m
fuente
¿Es posible que la Keysfunción tome un mapa con teclas de cualquier tipo, no solo cadenas?
Robert T. McGibbon
func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon necesita cambiar la función "prototipo"
a8m
1
@ArielM. Eso solo funcionaría para el tipo exacto map[interface{}]interface{}. Go no admite genéricos. No puede crear una función con un mapparámetro que acepte mapas con diferentes tipos de clave.
icza
10

¿Hay alguna manera de obtener una lista de todas las claves en un mapa de idioma Go?

ks := reflect.ValueOf(m).MapKeys()

¿Cómo itero sobre todas las claves?

Use la respuesta aceptada:

for k, _ := range m { ... }
Sridhar
fuente
1
Creo que quisiste decir for _, k := range v.MapKeys(), ya que en tu ejemplo, ksería el índice int de la porción de teclas
Brian Leishman