先单独说一下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的并发操作相关推荐

  1. c语言map函数k v都是int,Go语言sync.Map(在并发环境中使用的map)

    Go语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的. 下面来看下并发情况下读写 map 时会出现的问题,代码如下: // 创建一个int到int的映射 m := make(m ...

  2. C++语言map和unordered_map的下标操作

    C++语言map和unordered_map的下标操作 C++语言map和unordered_map的下标操作

  3. go map(映射)的概念、3种创建方式及map的CRUD操作

    引入 [1]映射(map), Go语言中内置的一种类型,它将键值对相关联,我们可以通过键 key来获取对应的值 value. 类似其它语言的集合 [2]基本语法 var map变量名 map[keyt ...

  4. mysql数据库限流方案_用于对MySQL数据库的并发操作进行控制的方法及装置的制造方法_3...

    的数据库操作特点,预先设置的所述第一限流类型可以不同于本实施例中的设置,同样可以实现本申请的技术方案,也在本申请的保护范围之内. [0103]步骤102-3:判断MySQL数据库的threads_ru ...

  5. Go 语言 map的使用

    Go 语言 map的使用 一.map 基本介绍: map 是 key-value 数据结构,又称为字段或者关联数组.(类似Python中的字典) 基本语法: var map 变量名 map[keyTy ...

  6. session文件无法并发操作

    session_start():打开服务器上的session文件. session_commit():会把$_SESSION数组的内容写入到服务器上的session文件中,但不会清空$_SESSION ...

  7. go语言编程之字符串操作

    2019独角兽企业重金招聘Python工程师标准>>> http://www.beckbi.cn/?p=288 go语言编程之字符串操作 转载于:https://my.oschina ...

  8. 黄聪:第2章 并发操作的一致性问题 (2)

    2.2 SQL Server 2000+ADO.NET实现并发控制 2.2.1 并发一致性问题 常见并发并发一致性问题包括:丢失的修改.不可重复读.读脏数据.幻影读(幻影读在一些资料中往往与不可重复读 ...

  9. 关于流水帐表序列号生成时的并发操作问题

    关于流水帐表序列号生成时的并发操作问题 1.某些流水张表的序号不是而是带有一定规则的,   如:四位的年份+2位周数+7位数字的序号       2007130000002.   假定表的定义如下: ...

最新文章

  1. 计算机网络工程应用,计算机网络工程网络命令的应用
  2. linux i2c ioctl错误,关于读写I2C总线的时候出错的有关问题
  3. 1.物理系统PhysicsWorld,RayCast
  4. 软键盘挡住输入框问题的终极解决方案
  5. ssd内部是多个flash一起操作_一键自毁军工级SSD固态硬盘的技术亮点
  6. window mysql5.5错误
  7. POJ NOI MATH-7652 乘积最大的拆分
  8. http协议报文体_http协议详解之响应报文 3
  9. HttpRunnerManager接口自动化测试框架在win环境下搭建教程
  10. concurrent 底层_JDK1.8 util-concurrent-ConcurrentLinkedQueue源码分析
  11. Windows系统重装教程完整版(系统备份、系统还原与重装)
  12. 沉迷游戏在心理学怎么解释
  13. 今天是冰桶算法大揭秘!!
  14. 网络篇 OSPF的DR与BDR的选举-48
  15. (翻译)分块模式(Chunking)
  16. HTML5期末大作业:个人网页设计——薛之谦6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  17. HHDBCS便捷功能简介
  18. AMI CORE8 OEM BIOS开发入门
  19. 数据分析-思维分析逻辑day01
  20. 真无线蓝牙耳机推荐:2021最受欢迎的TWS耳机品牌

热门文章

  1. 张钜楷;3.25黄金、原油、磅日、美加、澳美,外汇,今日行情分析及解套
  2. 解决error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8U
  3. Squid访问控制实例
  4. linux中fq格式转fa,利用linux处理fq/fa小练习
  5. Cocos Creator游戏引擎可以支持鼠标吗_Cocos Creator入门实战:桌球小游戏
  6. 培训python排行榜
  7. 实现私有DNS搭建(正向解析+反向解析+主从同步+安全措施+配置转发服务器+基于ACL实现智能DNS)
  8. [前端开发必备]Sugar-Electron轻量级前端开发框架
  9. 怎么显示隐藏的文件类型的后缀名
  10. 职业教育计算机教育美育,中职计算机职业素质教育