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?

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.


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]
}

¿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 { ... }

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.