go二维map_Golang使用Map的正确姿势

在Golang中,map是引用类型,直接声明未初始化会导致panic。使用make初始化map并确保并发安全至关重要。文章介绍了并发不安全的情况,如并发写入map导致的`fatal error: concurrent map writes`,并提供了多种解决方案,包括使用sync.Mutex、sync.RWMutex以及sync.Map。此外,还提到了第三方并发安全map包如cmap和concurrent包的使用。
摘要由CSDN通过智能技术生成

初始化后再使用

Golang中,map是引用类型,如切片一样,通过下面的代码声明后指向的是nil,所以千万别直接声明后就使用,新手可能经常会犯如下错误:

var m map[string]string

m["result"] = "result"

由于字典是引用类型,所以当我们仅声明而不初始化一个字典类型的变量的时候,他的值是nil。对值为nil的字段除添加键值对外其他操作都不会引发错误。上面的第一行代码对其进行写入操作,就是对空指针的引用,这将会造成一个painc。所以,得记得用 make函数对其进行分配内存和初始化:

m := make(map[string]string)

并发安全

并发安全也叫线程安全,在并发中出现了数据的丢失,称为并发不安全我们都知道非原子操作的都不是并发安全的,在Golang中map,其读写操作并不保证并发安全。如下面的操作

c := make(map[string]string)

wg := sync.WaitGroup{}

for i := 0; i < 10; i++ {

wg.Add(1)

go func(n int) {

k, v := strconv.Itoa(n), strconv.Itoa(n)

c[k] = v

wg.Done()

}(i)

}

wg.Wait()

fmt.Println(c)

运行则会出现下面的错误

fa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值