广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang 如何获取map所有key的方式
  • 122
分享到

golang 如何获取map所有key的方式

2024-04-02 19:04:59 122人浏览 薄情痞子
摘要

最佳方式:根据map的长度,新建一个数组,遍历map逐个压入 方法1(效率很高): func geTKEys1(m map[int]int) []int { // 数组默认长度

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

方法1(效率很高):


func geTKEys1(m map[int]int) []int {
 // 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率很高
 j := 0
 keys := make([]int, len(m))
 for k := range m {
  keys[j] = k
  j++
 }
 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 test
 
import (
 "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 := 0
 keys := make([]int, len(m))
 for k := range m {
  keys[j] = k
  j++
 }
 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) {
 // 初始化map
 m := initMap()
 
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  getKeys1(m)
 }
}
func BenchmarkMapkeys2(b *testing.B) {
 // 初始化map
 m := initMap()
 
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  getKeys2(m)
 }
}
 
func BenchmarkMapkeys3(b *testing.B) {
 // 初始化map
 m := initMap()
 
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  getKeys3(m)
 }
}
 
func BenchmarkMapkeys4(b *testing.B) {
 // 初始化map
 m := initMap()
 
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  getKeys4(m)
 }
}

补充:Golang踩坑——判断map中是否有key

最近在实习,下班回去十点多了,再加上比较懒,快有两个月没写东西了。

今天在开发一个模块的时候是接着上一个人的写的,好不容易各种配置写好了开始跑,发现他踩了一个很容易踩的坑。

把bug抽出来单独写了个文件


package main
 
import (
	"log"
)
 
type agent struct {
	id  int
	str string
}
 
var m map[int]*agent 
func main() {
	m = make(map[int]*agent)
	a := &agent{
		id:  1,
		str: "hello",
	}
	log.Println(a)
	var ok bool
	if a, ok = m[1]; ok {
		log.Println("ok")
	}
	m[1] = a
	log.Println(a)
	log.Println(a.str)
}

运行一下

可以看到报了无效指针的问题(invalid memory address or nil pointer dereference)。

从上面的两个log可以看到,最开始指针是有值的,第二个却没了,原因就出现在那个if判断那里。

if判断是想通过查看map知道agent是否已经存在,这个地方的错误是a,ok = map; 我们想通过ok判断是否存在,但是在这里还有个a,这会导致有一个对a赋值的操作,也就是说如果map里有这个值,那没事,如果没有的话a就被赋值成了nil了。

在下面打印的时候也就成了nil,取它的属性的时候会告诉我们找了个空指针的属性,这肯定找不到。

我们把a换成_,再来看结果:

ok了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文档:

--结束END--

本文标题: golang 如何获取map所有key的方式

本文链接: https://www.lsjlt.com/news/124498.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang 如何获取map所有key的方式
    最佳方式:根据map的长度,新建一个数组,遍历map逐个压入 方法1(效率很高): func getKeys1(m map[int]int) []int { // 数组默认长度...
    99+
    2022-11-12
  • java中获取hashmap中的所有key方式
    目录如何获取hashmap中的所有keyHashMap在获得Key的Hash值的时候用的是什么算法JDK hashCode总结如何获取hashmap中的所有key 在 Java 中,...
    99+
    2023-03-22
    java获取hashmap的key java hashmap key 获取hashmap所有key
  • redis获取所有key的方法
    keys:全量遍历键,用来列出所有满足特定正则字符串规则的key,假设Redis此时正在生产环境下,使用该命令就会造成隐患,当redis数据量比较大时: keys会一次性返回所有符合条件的key,所以会造成redis的卡...
    99+
    2023-04-10
    redis获取所有key redis获取key
  • java中如何获取map的所有键
    在Java中,可以使用`keySet()`方法获取Map的所有键。该方法返回一个Set集合,其中包含Map中所有的键。以下是一个示例...
    99+
    2023-08-31
    java
  • JS代码如何获取map的key
    目录JS获取map的keyJS map根据value获取key测试数据根据key获取value根据value获取keyJS获取map的key Object.keys(map...
    99+
    2022-11-13
  • java中如何获取map的key值
    在Java中,可以使用`Map`的`keySet()`方法获取`Map`的所有key值。`keySet()`方法返回一个`Set`集...
    99+
    2023-08-31
    java
  • redis通过lua脚本,获取满足key pattern的所有值方式
    我们知道,redis提供了keys命令去获取所有满足格式的key,如我们键入命令 keys "user*" 将得到所有以user开头的key 然后执行 mget命令可以获取多...
    99+
    2022-11-11
  • redis如何查看所有的key方式
    这篇文章主要介绍了redis如何查看所有的key方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。可以使用KEYS 命令KEYS pattern例如列出所有的key...
    99+
    2023-06-14
  • java如何获得redis所有的key-value
    目录获得redis所有的key-valueredis配置文件需要序列化redis集群获取所有的key,亲测有效redis单机查询所有key命令redis集群查所有key命令如本地测试...
    99+
    2022-11-13
  • Java Map.values()方法之如何获取Map集合中的所有键值对象
    目录Java Map.values()方法获取Map集合中的所有键值对象Java Map集合、Map集合的基本功能、Map集合的获取功能Map集合概述和使用Map集合的基本...
    99+
    2023-03-22
    Java Map.values()方法 Java获取Map集合 Map集合键值对象
  • 如何在redisCluster中模糊获取key方式
    本篇内容介绍了“如何在redisCluster中模糊获取key方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在一个集群中,显然不能通过k...
    99+
    2023-06-20
  • php如何获取对象的所有方法名
    这篇“php如何获取对象的所有方法名”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何获取对象的所有方法名”文章吧。在...
    99+
    2023-06-29
  • thinkphp如何获取模块下的所有方法
    这篇文章主要介绍“thinkphp如何获取模块下的所有方法”,在日常操作中,相信很多人在thinkphp如何获取模块下的所有方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”thinkphp如何获取模块下的所...
    99+
    2023-07-06
  • Java Map.values()方法之怎么获取Map集合中的所有键值对象
    今天小编给大家分享一下Java Map.values()方法之怎么获取Map集合中的所有键值对象的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获...
    99+
    2023-07-05
  • 如何获取所有spring管理的bean
    目录获取所有spring管理的beanIOC容器使用ListableBeanFactory接口使用Spring Boot Actuator小结一下spring管理bean的原理使用s...
    99+
    2022-11-12
  • JavaScript如何获取对象的所有键
    这篇文章主要为大家展示了“JavaScript如何获取对象的所有键”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何获取对象的所有键”这篇文章吧。获取对象的所有键cosnt&...
    99+
    2023-06-27
  • php如何获取一个对象中所有的方法
    今天小编给大家分享一下php如何获取一个对象中所有的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。创建一个 Reflec...
    99+
    2023-07-05
  • Springboot项目如何获取所有的接口
    目录Springboot项目获取所有接口获取项目下所有http接口的信息一、接口信息类二、单元测试Springboot项目获取所有接口 @Autowired private We...
    99+
    2022-11-12
  • redis中如何获取list中的所有元素
    这篇文章主要介绍了redis中如何获取list中的所有元素,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一种方法是用 lrange( key, 0, -1 )。这种方法不会影...
    99+
    2023-06-14
  • Java如何获取接口所有的实现类
    目录Java获取接口所有的实现类反射获取接口的所有实现类总结Java获取接口所有的实现类 最近因业务需求,要实现NodeRed服务后端化,为使各个节点的解析进行插件化(NodeRed...
    99+
    2023-01-09
    Java接口 Java实现类 Java获取接口实现类
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作