第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Golang使用Map的正確姿勢(shì)

標(biāo)簽:
Go

初始化后再使用

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)

运行则会出现下面的错误

fatal error: concurrent map writes

你可以通过运行go run --race来对程序进行竞态检测

那么如何解决这个问题呢?

通过锁机制解决并发问题

下面介绍几种常见的并发安全的操作map的方法

sync.Mutex

c := make(map[string]string)
wg := sync.WaitGroup{}
var lock sync.Mutex
for i := 0; i < 10; i++ {
    wg.Add(1)
    go func(n int) {
    	k, v := strconv.Itoa(n), strconv.Itoa(n)
    	lock.Lock()
    	c[k] = v
    	lock.Unlock()
    	wg.Done()
    }(i)
}
wg.Wait()
fmt.Println(c)

当然这里也可以使用读写锁sync.RWMutex,这样并发读多的场景下性能要好。

sync.Map

sync.Map 是官方出品的并发安全的map,他在内部使用了大量的原子操作来存取键和值,并使用了read和dirty二个原生map作为存储介质,具体实现流程可阅读相关源码。

var m sync.Map

//写
m.Store("foo", "hello world")
m.Store("slice", []int{1, 2, 3, 4, 5, 6, 7})
m.Store("int", 123)
//读
m.Load("foo")
m.Load("slice")
m.Load("int")
//删
m.Delete("int")

第三方map包

第三方包的实现都大同小异,基本上都是使用分离锁来实现并发安全的,具体分离锁来实现并发安全的原理可参考下面的延伸阅读

m := cmap.New()
//写
m.Set("foo", "hello world")
m.Set("slice", []int{1, 2, 3, 4, 5, 6, 7})
m.Set("int", 1)
//读
m.Get("foo")  
m.Get("slice") 
m.Get("int")  
m := concurrent.NewConcurrentMap()
m.Put("foo", "hello world")
m.Put("slice", []int{1, 2, 3, 4, 5, 6, 7})
m.Put("int", 1)
//读
m.Get("foo")  
m.Get("slice") 
m.Get("int") 
點(diǎn)擊查看更多內(nèi)容
1人點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶(hù)
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消