最佳方式:根据map的长度,新建一个数组,遍历map逐个压入

方法1(效率很高):

func getKeys1(m map[int]int) []int {// 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率很高j := 0keys := make([]int, len(m))for k := range m {keys[j] = kj++}return keys
}

方法2(效率很高):

func getKeys2(m map[int]int) []int {// 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率很高keys := make([]int, 0, len(m))for k := range m {keys = append(keys, k)}return keys
}

其他方式:

方法3(效率较低):

func getKeys3(m map[int]int) []int {// 注意:由于数组默认长度为0,后面append时,需要重新申请内存和拷贝,所以效率较低keys := []int{}for k := range m {keys = append(keys, k)}return keys
}

方法4(效率极低):

func getKeys4(m map[int]int) int {// 注意:虽然此写法简洁,但MapKeys函数内部操作复杂,效率极低keys := reflect.ValueOf(m).MapKeys()return len(keys)
}

实验结果如图(可以看到方法1和方法2效率最高,内存操作也最少):

完整代码如下:

package testimport ("reflect""testing"
)// 初始化map
func initMap() map[int]int {m := map[int]int{}for i := 0; i < 10000; i++ {m[i] = i}return m
}func getKeys1(m map[int]int) []int {// 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率较高j := 0keys := make([]int, len(m))for k := range m {keys[j] = kj++}return keys
}func getKeys2(m map[int]int) []int {// 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率较高keys := make([]int, 0, len(m))for k := range m {keys = append(keys, k)}return keys
}// 初始化默认
func getKeys3(m map[int]int) []int {// 注意:由于数组默认长度为0,后面append时,需要重新申请内存和拷贝,所以效率较低keys := []int{}for k := range m {keys = append(keys, k)}return keys
}// 使用反射
func getKeys4(m map[int]int) int {// 注意:虽然此写法简洁,但MapKeys函数内部操作复杂,效率极低keys := reflect.ValueOf(m).MapKeys()return len(keys)
}func BenchmarkMapkeys1(b *testing.B) {// 初始化mapm := initMap()b.ResetTimer()for i := 0; i < b.N; i++ {getKeys1(m)}
}
func BenchmarkMapkeys2(b *testing.B) {// 初始化mapm := initMap()b.ResetTimer()for i := 0; i < b.N; i++ {getKeys2(m)}
}func BenchmarkMapkeys3(b *testing.B) {// 初始化mapm := initMap()b.ResetTimer()for i := 0; i < b.N; i++ {getKeys3(m)}
}func BenchmarkMapkeys4(b *testing.B) {// 初始化mapm := initMap()b.ResetTimer()for i := 0; i < b.N; i++ {getKeys4(m)}
}

golang 获取map所有key的方式相关推荐

  1. Java获取map中key和value的方法

    最近项目技术转型,开始使用java来写需求.需求中碰到需要获取map中key和value的地方,网络上查了下,得到了解决方法.为防止遗忘,故记录于此. java中获取map中key和value的方式有 ...

  2. JAVA 通过value获取Map中key的三种方法

    JAVA 通过value获取Map中key的三种方法 简介 方法描述 循环法 Stream方法 Apache Commons Collections的BidiMap 总结 简介 我们都知道Map是存放 ...

  3. Java遍历Map的五种方式

    一.遍历Map的五种方式 java中遍历map一般有五种方法,从最早的Iterator,到java5支持的foreach,再到java8的Lambda表达式. 如果只是获取key,或者value,推荐 ...

  4. new Map()详细介绍 map .set(key,value)map.sizemap.get(key)map.has(key)map.delete(key)map.clear()

    1.let map = new Map();     2.let map = new Map([[key,value],[key,value]]); //默认带初始化参数的定义 理解就是:new Ma ...

  5. 【Groovy】map 集合 ( 根据 Key 获取 map 集合中对应的值 | map.Key 方式 | map.‘Key’ 方式 | map[‘Key’] 方式 | 代码示例 )

    文章目录 一.根据 Key 获取 map 集合中对应的值 1.通过 map.Key 方式获取 map 集合中的值 Value 2.通过 map.'Key' 方式获取 map 集合中的值 Value 3 ...

  6. Map排序,获取map的第一值,根据value取key等操作(数据预处理)

    这里为了以后自己再做数据预处理使用,做一下笔记. package deal;import java.io.File; import java.util.ArrayList; import java.u ...

  7. 通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  8. keytool输出sha1,造成Google Map API Key无法获取的解决办法

    申请google map api key是需要使用keytool工具生成密纹 keytool -list -alias androiddebugkey -keystore debug.keystore ...

  9. golang map 删除key后内存不会自动释放,内存泄漏问题

    全局map ,会有内存释放问题 package mainimport ("fmt""github.com/thoas/go-funk""math&qu ...

  10. Go 学习笔记(12)— 字典map定义、初始化、读取字典、删除字典、清空字典、map 按 key 进行有序遍历

    Go 中字典也叫做 map , map 是一种无序的键值对的集合. map 最重要的一点是通过 key 来快速检索数据, key 类似于索引,指向数据的值. 1. 字典定义 可以使用内建函数 make ...

最新文章

  1. python init文件作用___init__.py 文件的作用
  2. handlerinterceptoradapter 获取请求参数_SSM框架防止重复请求
  3. C#中使用SoundPlayer播放音频文件(wav文件)
  4. 注入dll到一个进程里面
  5. html的排版标题的是,HTML 5结构排版布局
  6. 业务单号自动增长的处理办法
  7. CSS 动态超链接样式 LVFHA 或 LVHFA
  8. html 折叠焦点图切换,自适应全屏焦点图切换CSS3特效
  9. CSS3 修改和去除移动端点击事件出现的背景框
  10. 推荐一款优秀的注册表和临时文件等清理软件-CCleaner
  11. Day1通信基本概念 通信系统模型 通信系统分类与通信方式
  12. Springboot毕设项目餐厅后勤管理系统cxjgl(java+VUE+Mybatis+Maven+Mysql)
  13. 凭据分配没有加密oracle_两种方法解决远程桌面出现“这可能是由于CredSSP加密Oracle修正”的问题-网络教程与技术 -亦是美网络...
  14. Mac下Jmeter基本使用
  15. 计算机系军训横幅,军训横幅标语有创意精选100句
  16. 计算机网络对社会发展的影响
  17. 获得内核函数地址的四种方法
  18. speedoffice如何调整Word文档表格单元格大小
  19. UE4学习笔记——粒子发射器
  20. TexturePacker 命令行方式调用参数

热门文章

  1. Day54 Java框架 SSH案例_CRM(二)
  2. CC2640R2F学习笔记二:昇润科技开发资料阅读
  3. 机器人学笔记之——操作臂运动学:驱动器空间、关节空间和笛卡尔空间
  4. 大白菜u盘装win10步骤图解
  5. 基于MATLAB与Python计算长时间遥感栅格图像的像元值变异系数(CV)
  6. 使用LibreOffice实现word转pdf(python代码)
  7. mysql 切换用户_mysql+keepalive高可用方案操盘实战
  8. 西游记不单单讲的是故事(1) ------ 摘自 吴闲云的《煮酒探西游》
  9. python网易公开课官网_可汗学院公开课:计算机科学
  10. bochs运行xp_bochs xp镜像完整免费版