3 回答
TA贡献1770条经验 获得超3个赞
例如,
package main
func main() {
mymap := make(map[int]string)
keys := make([]int, 0, len(mymap))
for k := range mymap {
keys = append(keys, k)
}
}
为了在 Go 中高效,最小化内存分配很重要。
TA贡献1853条经验 获得超6个赞
这是一个老问题,但这是我的两分钱。PeterSO 的回答稍微简洁一些,但效率稍低一些。您已经知道它将有多大,因此您甚至不需要使用 append:
keys := make([]int, len(mymap))
i := 0
for k := range mymap {
keys[i] = k
i++
}
在大多数情况下,它可能不会有太大的不同,但它的工作量并不大,在我的测试中(使用具有 1,000,000 个随机int64键的映射,然后使用每种方法生成键的数组十次),大约是直接分配数组成员比使用 append 快 20%。
尽管设置容量可以消除重新分配,但 append 仍然需要做额外的工作来检查您是否已达到每次 append 的容量。
TA贡献1829条经验 获得超7个赞
您还可以从包“reflect”中[]Value通过MapKeys结构方法获取类型为键的数组Value:
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) // [a b c]
}
- 3 回答
- 0 关注
- 201 浏览
添加回答
举报