90%的Go语言程序员map遍历方式都是错的

简介: 90%的Go语言程序员map遍历方式都是错的

/ Go 语言遍历 map 完全指南 /

map 是 Go 语言内置的一种键值对数据结构,用于存储不重复的键值对数据。要访问 map 的所有元素,需要对 map 进行遍历。遍历 map 是 Go 语言中一项基础但重要的技能。

本文将全面介绍如何遍历 Go 语言中的 map,内容涵盖:

  1. for range 遍历 map
  2. 只遍历 key 或 value
  3. 按照特定顺序遍历
  4. 遍历时删除元素
  5. 安全遍历 map
  6. 性能优化
  7. 应用场景

通过详细的讲解和运行示例,可以全面掌握 Go 语言中遍历 map 的知识要点,以及各种遍历技巧的应用。这将大大提高我们处理 map 类型数据的能力。


1

 

1. for range 遍历 map

for range 语句可以用来遍历 map,语法如下:

for key, value := range map {
  //代码
}

它会返回 map 中的每一个键值对,key 是键,value 是对应的值。

例如:

m := map[string]int{"a": 1, "b": 2}
for k, v := range m {
  fmt.Println(k, v) 
}
// 输出:
// a 1
// b 2

用 range 遍历一个 map 会以随机顺序返回所有键值对。


2

 

2. 只遍历 key 或 value

可以通过只接受一个返回值来只遍历 key 或 value:

只要 key:

for key := range m {
  fmt.Println(k)
}

只要 value:

for _, value := range m {
  fmt.Println(value)
}

使用 _ 空标识符忽略不需要的返回值。


3

 

3. 按顺序遍历

map 的遍历顺序是不确定的,要保证顺序需要额外处理。

一个方法是先将 key 放入切片排序,然后遍历切片:

import "sort"
var m = map[int]string{2: "two", 1:"one"} 
keys := make([]int, 0, len(m))
for k := range m {
  keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
  fmt.Println(k, m[k]) 
}
// 1 one
// 2 two

遍历时每次都会按照插入的顺序打印。


4

 

4. 遍历时删除元素

可以在遍历 map 的时候实时删除元素:

for k, v := range m {
  if meetCondition(k) {
    delete(m, k)
  }
}

但需要注意的是,删除操作会在下次遍历生效,并不会影响当前循环。

不能在遍历中添加元素,会引起运行时错误。


5

 

5. 安全遍历

对 map 的遍历和写操作不是线程安全的,需要采取措施防止数据竞争。

安全遍历 map 的方法有两种:

  1. 遍历时加锁
    可以用 sync.RWMutex 来保证互斥访问:
mu sync.RWMutex // 声明锁
mu.RLock() 
for k, v := range m {
  // 读取map
}
mu.RUnlock()

2. 遍历 map 的只读副本

通过复制生成只读副本:

mCopy := make(map[string]int) 
for k, v := range m {
  mCopy[k] = v
}
// 遍历mCopy副本

这样可以安全地并发遍历 map。


6

 

6. 性能优化

map 遍历时可以通过以下优化提高性能:

  • 复用变量,避免重复分配内存
  • 预计算 map 长度,避免多次调用 len
  • 将 map 转换为切片,减少哈希计算
  • 按顺序遍历,增加 CPU 缓存命中

优化后的遍历:

length := len(m)
keys := make([]int, length) // 预分配keys长度
i := 0 
for k := range m {
  keys[i] = k
  i++
}

这种顺序遍历方式可以大幅提高性能。


7

 

7. 应用场景

  • 打印 key-value
  • 搜索 value
  • 过滤元素
  • 统计出现频率
  • map 转换处理

例如统计单词出现频率:

freq := make(map[string]int)
for _, w := range words {
  freq[w]++
}
// freq map存储了单词频率

map 遍历功能强大,可以处理 map 转化为其他类型,生成报表等操作。


8

 

总结

本文详细讲解了 Go 语言中遍历 map 的知识,包括基本遍历方法、保序遍历、安全遍历、优化等技巧。充分掌握这些可以使我们更自由地处理 map 类型的数据,发挥 map 的最大价值。如果你在遍历 map 时还有其他疑问,欢迎留言讨论。


目录
相关文章
|
15天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
58 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
1月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
103 71
|
1月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
107 67
|
10天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
46 12
|
13天前
|
监控 算法 安全
解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
21 0
|
27天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
|
Go
golang遍历返回全部目录不返回具体的文件名
使用参考: d := dir.NewDir("/") dirs, err := d.LoopLevelDir(0) // 实现遍历目录的功能// 也可以指定层级遍历,遍历几层目录package dir import ( "fmt" "io/ioutil" "strings" "time" ) t...
927 0
|
1月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
42 7
|
1月前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
106 62
下一篇
开通oss服务