Iterating over all the keys of a map

Is there a way to get a list of all the keys in a Go language map? The number of elements is given by len(), but if I have a map like:

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

How do I iterate over all the keys?

5 Answers

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

or

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

Go language specs for for statements specifies that the first value is the key, the second variable is the value, but doesn't have to be present.

4

Here's some easy way to get slice of the map-keys.

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

Is there a way to get a list of all the keys in a Go language map?

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

how do I iterate over all the keys?

Use the accepted answer:

for k, _ := range m { ... }
1

A Type agnostic solution:

for _, key := range reflect.ValueOf(yourMap).MapKeys() { value := yourMap.MapIndex(key).Interface() fmt.Println("Key:", key, "Value:", value)
} 
2

Using Generics:

func Keys[K comparable, V any](m map[K]V) []K { keys := make([]K, 0, len(m)) for k := range m { keys = append(keys, k) } return keys
}

You Might Also Like