成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go語言切片原生支持并發(fā)嗎?

開發(fā) 前端
今天與大家聊一個(gè)比較冷門的高頻面試題,關(guān)于切片的,Go語言中的切片原生支持并發(fā)嗎?怎么樣,心里有答案了嘛,帶著你的思考我們一起來看一看這個(gè)知識(shí)點(diǎn)。

實(shí)踐檢驗(yàn)真理

實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),所以當(dāng)我們遇到一個(gè)不確定的問題,直接寫demo來驗(yàn)證,因?yàn)榍衅奶攸c(diǎn),我們可以分多種情況來驗(yàn)證:

  • 不指定索引,動(dòng)態(tài)擴(kuò)容并發(fā)向切片添加數(shù)據(jù)。
func concurrentAppendSliceNotForceIndex() {
sl := make([]int, 0)
wg := sync.WaitGroup{}
for index := 0; index < 100; index++{
k := index
wg.Add(1)
go func(num int) {
sl = append(sl, num)
wg.Done()
}(k)
}
wg.Wait()
fmt.Printf("final len(sl)=%d cap(sl)=%d\n", len(sl), cap(sl))
}

通過打印數(shù)據(jù)發(fā)現(xiàn)每次的結(jié)果都不一致,先不急出結(jié)論,我們?cè)趯懫渌膁emo測(cè)試一下:

  • 指定索引,指定容量并發(fā)向切片添加數(shù)據(jù)
func concurrentAppendSliceForceIndex() {
sl := make([]int, 100)
wg := sync.WaitGroup{}
for index := 0; index < 100; index++{
k := index
wg.Add(1)
go func(num int) {
sl[num] = num
wg.Done()
}(k)
}
wg.Wait()
fmt.Printf("final len(sl)=%d cap(sl)=%d\n", len(sl), cap(sl))
}

通過結(jié)果我們可以發(fā)現(xiàn)符合我們的預(yù)期,長(zhǎng)度和容量都是100,所以說slice支持并發(fā)嗎?

slice支持并發(fā)嗎?

我們都知道切片是對(duì)數(shù)組的抽象,其底層就是數(shù)組,在并發(fā)下寫數(shù)據(jù)到相同的索引位會(huì)被覆蓋,并且切片也有自動(dòng)擴(kuò)容的功能,當(dāng)切片要進(jìn)行擴(kuò)容時(shí),就要替換底層的數(shù)組,在切換底層數(shù)組時(shí),多個(gè)goroutine是同時(shí)運(yùn)行的,哪個(gè)goroutine先運(yùn)行是不確定的,不論哪個(gè)goroutine先寫入內(nèi)存,肯定就有一次寫入會(huì)覆蓋之前的寫入,所以在動(dòng)態(tài)擴(kuò)容時(shí)并發(fā)寫入數(shù)組是不安全的;

所以當(dāng)別人問你slice支持并發(fā)時(shí),你就可以這樣回答它:

當(dāng)指定索引使用切片時(shí),切片是支持并發(fā)讀寫索引區(qū)的數(shù)據(jù)的,但是索引區(qū)的數(shù)據(jù)在并發(fā)時(shí)會(huì)被覆蓋的;當(dāng)不指定索引切片時(shí),并且切片動(dòng)態(tài)擴(kuò)容時(shí),并發(fā)場(chǎng)景下擴(kuò)容會(huì)被覆蓋,所以切片是不支持并發(fā)的~。

github上著名的iris框架也曾遇到過切片動(dòng)態(tài)擴(kuò)容導(dǎo)致webscoket連接數(shù)減少的bug,最終采用sync.map解決了該問題。

總結(jié)

針對(duì)上述問題,我們可以多種方法來解決切片并發(fā)安全的問題:

  • 加互斥鎖
  • 使用channel串行化操作
  • 使用sync.map代替切片

切片的問題還是比較容易解決,針對(duì)不同的場(chǎng)景可以選擇不同的方案進(jìn)行優(yōu)化,你學(xué)會(huì)了嗎?

責(zé)任編輯:武曉燕 來源: Golang夢(mèng)工廠
相關(guān)推薦

2022-01-10 23:54:56

GoMap并發(fā)

2023-05-15 08:01:16

Go語言

2014-07-15 11:16:17

Go語言

2024-01-01 08:10:40

Go語言map

2024-01-05 08:45:35

Go語言map

2023-03-29 08:03:53

2023-04-03 08:02:16

切片擴(kuò)容GO

2018-08-20 08:15:50

編程語言Go語言切片

2021-07-13 06:44:04

Go語言數(shù)組

2023-12-21 07:09:32

Go語言任務(wù)

2021-07-30 07:28:15

WorkerPoolGo語言

2013-05-28 09:43:38

GoGo語言并發(fā)模式

2021-07-15 23:18:48

Go語言并發(fā)

2023-02-10 09:40:36

Go語言并發(fā)

2022-06-22 09:24:30

云原生Go 語言

2023-01-30 15:41:10

Channel控制并發(fā)

2022-11-10 07:43:45

2023-03-13 00:10:46

Go語言版本

2022-02-14 08:25:50

Go語言面試

2021-04-09 10:38:59

Go 語言數(shù)組與切片
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品一区二区视频 | 亚洲理论在线观看电影 | 久久精品二区亚洲w码 | 欧美一区二区三区久久精品 | 免费簧片视频 | www.久久国产精品 | 在线看日韩 | 欧美中文字幕一区 | 国产精品www | 日韩国产黄色片 | 成人av片在线观看 | 在线看片福利 | 99久久久无码国产精品 | 亚洲国产精品久久久久秋霞不卡 | 久久亚洲一区二区三区四区 | 欧美午夜精品 | 日日操av | 欧美一区二区三区在线 | 国产精品精品久久久 | www久久av | 欧美日韩一区二区三区四区 | 一区二区三区不卡视频 | 中文字幕91 | 亚洲国产aⅴ精品一区二区 免费观看av | 久久久91精品国产一区二区三区 | 亚洲在线一区二区 | 久久三区 | 三级高清 | 日本三级黄视频 | 五月天综合影院 | 91文字幕巨乱亚洲香蕉 | 99热热热热| 国产一区二区三区在线看 | 免费国产一区 | 蜜臀久久| 综合在线视频 | 国产探花在线观看视频 | 日韩一区二区三区视频在线观看 | 日韩国产中文字幕 | 欧美日韩国产综合在线 | 国产一区二区在线免费观看 |