Go语言map的并发操作
先单独说一下map,在Go语言中,map与通道类似,都需要先用make函数进行初始化,之后才可以赋值,不过map没有长度的限制,所以在使用make函数初始化map时,make函数的第二个参数不用写,写不写没有区别。
package mainimport "fmt"func main() {var m map[int]int//m = make(map[int]int,20)m[22] = 10fmt.Println(len(m))
}
运行结果
panic: assignment to entry in nil mapgoroutine 1 [running]:
main.main()
错误原因,赋值给空map。
package mainimport "fmt"func main() {var m map[int]intm = make(map[int]int,20)m[22] = 10fmt.Println(len(m))
}
用make函数初始化map时,make的第二个参数写上也没有意义。
map在并发中
Go语言中map不是并发安全的,map不可以并发的写,但是可以并发的读。
package mainimport ("fmt""sync"
)func main() {wg := sync.WaitGroup{}m := make(map[int]int)const N = 20wg.Add(N)for i := 0; i < N; i++ {go func() {defer wg.Done()m[i] = i}()}wg.Wait()fmt.Println(len(m))fmt.Println(m)
}
运行结果
fatal error: concurrent map writesgoroutine 7 [running]:
runtime.throw(0x10c4e4d, 0x15)
map在goroutine中并发写的时候不是线程安全的,所以不加锁会报错。
加锁后才可以并发写入
mu.Lock()
defer wg.Done()
m[i] = i
mu.Unlock()
不用加锁,可以并发读取
package mainimport ("fmt""sync"
)func main() {wg := sync.WaitGroup{}m := make(map[int]int)const N = 20for i := 0; i < N; i++ {m[i] = i}wg.Add(N)for i := 0; i < N; i++ {go func(n int) {fmt.Print(m[n],"\t")wg.Done()}(i)}wg.Wait()fmt.Println("\n")fmt.Println(m)fmt.Println(len(m))
}
运行结果
19 6 7 8 9 10 11 12 13 14 15 16 17 18 5 3 4 0 2 1 map[6:6 10:10 11:11 15:15 17:17 1:1 2:2 4:4 7:7 8:8 16:16 0:0 3:3 9:9 19:19 5:5 12:12 13:13 14:14 18:18]
20
Go语言map的并发操作相关推荐
- c语言map函数k v都是int,Go语言sync.Map(在并发环境中使用的map)
Go语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的. 下面来看下并发情况下读写 map 时会出现的问题,代码如下: // 创建一个int到int的映射 m := make(m ...
- C++语言map和unordered_map的下标操作
C++语言map和unordered_map的下标操作 C++语言map和unordered_map的下标操作
- go map(映射)的概念、3种创建方式及map的CRUD操作
引入 [1]映射(map), Go语言中内置的一种类型,它将键值对相关联,我们可以通过键 key来获取对应的值 value. 类似其它语言的集合 [2]基本语法 var map变量名 map[keyt ...
- mysql数据库限流方案_用于对MySQL数据库的并发操作进行控制的方法及装置的制造方法_3...
的数据库操作特点,预先设置的所述第一限流类型可以不同于本实施例中的设置,同样可以实现本申请的技术方案,也在本申请的保护范围之内. [0103]步骤102-3:判断MySQL数据库的threads_ru ...
- Go 语言 map的使用
Go 语言 map的使用 一.map 基本介绍: map 是 key-value 数据结构,又称为字段或者关联数组.(类似Python中的字典) 基本语法: var map 变量名 map[keyTy ...
- session文件无法并发操作
session_start():打开服务器上的session文件. session_commit():会把$_SESSION数组的内容写入到服务器上的session文件中,但不会清空$_SESSION ...
- go语言编程之字符串操作
2019独角兽企业重金招聘Python工程师标准>>> http://www.beckbi.cn/?p=288 go语言编程之字符串操作 转载于:https://my.oschina ...
- 黄聪:第2章 并发操作的一致性问题 (2)
2.2 SQL Server 2000+ADO.NET实现并发控制 2.2.1 并发一致性问题 常见并发并发一致性问题包括:丢失的修改.不可重复读.读脏数据.幻影读(幻影读在一些资料中往往与不可重复读 ...
- 关于流水帐表序列号生成时的并发操作问题
关于流水帐表序列号生成时的并发操作问题 1.某些流水张表的序号不是而是带有一定规则的, 如:四位的年份+2位周数+7位数字的序号 2007130000002. 假定表的定义如下: ...
最新文章
- 计算机网络工程应用,计算机网络工程网络命令的应用
- linux i2c ioctl错误,关于读写I2C总线的时候出错的有关问题
- 1.物理系统PhysicsWorld,RayCast
- 软键盘挡住输入框问题的终极解决方案
- ssd内部是多个flash一起操作_一键自毁军工级SSD固态硬盘的技术亮点
- window mysql5.5错误
- POJ NOI MATH-7652 乘积最大的拆分
- http协议报文体_http协议详解之响应报文 3
- HttpRunnerManager接口自动化测试框架在win环境下搭建教程
- concurrent 底层_JDK1.8 util-concurrent-ConcurrentLinkedQueue源码分析
- Windows系统重装教程完整版(系统备份、系统还原与重装)
- 沉迷游戏在心理学怎么解释
- 今天是冰桶算法大揭秘!!
- 网络篇 OSPF的DR与BDR的选举-48
- (翻译)分块模式(Chunking)
- HTML5期末大作业:个人网页设计——薛之谦6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
- HHDBCS便捷功能简介
- AMI CORE8 OEM BIOS开发入门
- 数据分析-思维分析逻辑day01
- 真无线蓝牙耳机推荐:2021最受欢迎的TWS耳机品牌
热门文章
- 张钜楷;3.25黄金、原油、磅日、美加、澳美,外汇,今日行情分析及解套
- 解决error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8U
- Squid访问控制实例
- linux中fq格式转fa,利用linux处理fq/fa小练习
- Cocos Creator游戏引擎可以支持鼠标吗_Cocos Creator入门实战:桌球小游戏
- 培训python排行榜
- 实现私有DNS搭建(正向解析+反向解析+主从同步+安全措施+配置转发服务器+基于ACL实现智能DNS)
- [前端开发必备]Sugar-Electron轻量级前端开发框架
- 怎么显示隐藏的文件类型的后缀名
- 职业教育计算机教育美育,中职计算机职业素质教育