为了账号安全,请及时绑定邮箱和手机立即绑定

从地图中获取一部分键

从地图中获取一部分键

Go
慕沐林林 2021-07-13 17:14:02
有没有更简单/更好的方法可以从 Go 中的地图中获取一段键?目前我正在遍历地图并将键复制到切片:i := 0keys := make([]int, len(mymap))for k := range mymap {    keys[i] = k    i++}
查看完整描述

3 回答

?
德玛西亚99

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 中高效,最小化内存分配很重要。


查看完整回答
反对 回复 2021-07-19
?
墨色风雨

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 的容量。


查看完整回答
反对 回复 2021-07-19
?
吃鸡游戏

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]

}


查看完整回答
反对 回复 2021-07-19
  • 3 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信