golang map为啥不并发


本文摘自php中文网,作者(*-*)浩,侵删。

map数据类型在很多语言中都有,是一个key,value形式的hash表,从而将key,value进行一一映射,进行快速查找、添加、删除等操作。在Go语言中也不例外,提供了map数据结构类型。

内建map切忌开箱即用 (推荐学习:go)

Golang中,map是引用类型,如指针切片一样,通过下面的代码声明后指向的是nil。这点在golang官方文档中也说明了,所以千万别直接声明后就使用,开始可能经常会犯下面的错:

1

2

var m map[string]string

m["result"] = "result"

上面的第一行代码并没有对map进行一个初始化,而却对其进行写入操作,就是对空指针的引用,这将会造成一个painc。

所以,得记得用make函数对其进行分配内存和初始化:

1

2

m := make(map[string]string)

m["result"] = "result"

golang中的map并不是并发安全的

经常使用map,平时用着也很爽,但是突然某天流量上来了,程序不知不觉就挂了,还不清楚是怎么回事,明明以前用着好好的呀。

所以有些好习惯在刚开始就养成,比如断言检查,并发安全考虑等。

map纵然很好用,但也得谨慎。或许很多人还不知道,golang内建map其实并不是并发安全的。

或许你可以尝试下sync.Map

golang中的sync.Map是并发安全的,其实也就是sync包中golang自定义的一个名叫Map的结构体。结构体原型如下:

1

2

3

4

5

6

type Map struct {

   mu Mutex

   read atomic.Value // readOnly

   dirty map[interface{}]*entry

   misses int

}

以上就是golang map为啥不并发的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

聊聊dubbo-go-proxy的discoveryservice

聊聊go-ddd-sample

golang有web框架吗

go 项目开发过程中的管理规范

10 golang map的正确使用姿势

手撸golang 仿spring ioc/aop 之7 扫码2

client-go获取k8s集群内部连接,实现deployment的增删改查

golang如何处理输入?

rust 内存管理

golang能封装成dll吗

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...