Getting a slice of keys from a map

This is an old question, but here’s my two cents. PeterSO’s answer is slightly more concise, but slightly less efficient. You already know how big it’s going to be so you don’t even need to use append:

keys := make([]int, len(mymap))

i := 0
for k := range mymap {
    keys[i] = k
    i++
}

In most situations it probably won’t make much of a difference, but it’s not much more work, and in my tests (using a map with 1,000,000 random int64 keys and then generating the array of keys ten times with each method), it was about 20% faster to assign members of the array directly than to use append.

Although setting the capacity eliminates reallocations, append still has to do extra work to check if you’ve reached capacity on each append.

Leave a Comment