2009-12-03 27 views
187

¿Hay alguna forma de obtener una lista de todas las claves en un mapa de idioma Go? El número de elementos está dada por len(), pero si tengo un mapa como:Iterar todas las teclas de un mapa

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

¿Cómo iterar sobre todas las llaves?

Respuesta

310

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

Go language specs for for statements especifica que el primer valor es la clave, la segunda variable es el valor, pero no tiene que estar presente.

+9

Como posible gotcha, tenga en cuenta que el fin de la iteración no está definido. https://groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ – mna

+15

Sudhir: la especificación del lenguaje golang define explícitamente que los mapas tienen un orden indefinido de las teclas. Además, desde Go 1, el orden de las teclas se aleatoriza intencionadamente entre las ejecuciones para evitar la dependencia de cualquier orden percibido. –

+3

Tenga en cuenta que esto no es una iteración mutable, lo que significa que eliminar una clave requerirá que reinicie la iteración. –

8

Aquí hay una manera fácil de obtener slice de las teclas de 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] 
} 
+0

¿Es posible que la función 'Keys' tome un mapa con claves de cualquier tipo, no solo con cadenas? –

+0

'func Keys (m interfaz de mapa [interfaz {}] {}) (teclas [] interfaz {})', @ RobertT.McGibbon debe cambiar la función "prototipo" – a8m

+1

@ArielM. Eso solo funcionaría para el tipo exacto 'map [interface {}] interface {}'. Go no es compatible con los genéricos. No puede crear una función con un parámetro 'map' que acepte mapas con diferentes tipos de clave. – icza

2

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

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

¿Cómo puedo iterar sobre todas las llaves?

Utilice la respuesta aceptada:

for k, _ := range m { ... } 
Cuestiones relacionadas