首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从映射中获取一段键

从映射中获取一段键
EN

Stack Overflow用户
提问于 2014-01-26 19:48:25
回答 7查看 298.9K关注 0票数 325

有没有更简单/更好的方法来从Go中的map中获取一段键?

目前,我正在迭代map并将键复制到一个切片中:

代码语言:javascript
复制
i := 0
keys := make([]int, len(mymap))
for k := range mymap {
    keys[i] = k
    i++
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-01-26 20:53:31

例如,

代码语言:javascript
复制
package main

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

为了在Go中高效,最大限度地减少内存分配非常重要。

票数 265
EN

Stack Overflow用户

发布于 2015-01-09 03:36:40

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

代码语言:javascript
复制
keys := make([]int, len(mymap))

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

在大多数情况下,这可能不会有太大的不同,但也不会有太多的工作,而且在我的测试中(使用一个具有1,000,000个随机int64键的映射,然后使用每个方法生成10次键的数组),直接分配数组的成员比使用append快大约20%。

尽管设置容量会消除重新分配,append仍然需要做额外的工作来检查您是否在每个append上达到了容量。

票数 458
EN

Stack Overflow用户

发布于 2016-04-03 23:55:54

你也可以通过“reflect”包中的struct的MapKeys方法获取类型为[]Value的键数组:

代码语言:javascript
复制
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]
}
票数 106
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21362950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档