Golang – 从地图上获取一部分密钥

在Go中有没有更简单/更好的方法来从一张地图中获得一个键?

目前我正在迭代地图并将键复制到一个切片:

i := 0 keys := make([]int, len(mymap)) for k := range mymap { keys[i] = k i++ } 

例如,

 package main func main() { mymap := make(map[int]string) keys := make([]int, 0, len(mymap)) for k := range mymap { keys = append(keys, k) } } 

为了在Go中保持高效,重要的是尽量减less内存分配。

这是一个古老的问题,但这是我的两分钱。 PeterSO的答案稍微简洁一些,但效率略低。 你已经知道它会有多大,所以你甚至不需要使用append:

 keys := make([]int, len(mymap)) i := 0 for k := range mymap { keys[i] = k i++ } 

在大多数情况下,它可能不会有太大的区别,但是没有什么更多的工作,在我的testing中(使用具有1,000,000个随机int64键的映射,然后用每种方法产生十次键的数组),它是比使用append直接分配数组成员快20%左右。

虽然设置容量消除了重新分配,但是追加仍然需要额外的工作来检查每个追加的容量是否已经达到。

你也可以通过types为[]Value的键的数组,通过来自package“reflect”的struct Value的方法MapKeys

 package main import ( "fmt" "reflect" ) func main() { abc := map[string]int{ "a": 1, "b": 2, "c": 3, } keys := reflect.ValueOf(abc).MapKeys() fmt.Println(keys) // [abc] } 

更好的方法是使用append

 keys = []int{} for k := range mymap { keys = append(keys, k) } 

除此之外,你不走运 – Go不是一个非常富有performance力的语言。