通過示例深度理解Go channel range
正文
我們來看下兩端代碼:
代碼段1
func main() { channels := make([]chan int, 10) for i := 0; i < 10; i++ { go func(ch chan int) { time.Sleep(time.Second) ch <- 1 }(channels[i]) } for ch := range channels { fmt.Println("Routine ", ch, " quit!") } fmt.Println("結(jié)束") }
猜想下這上面會(huì)打印什么結(jié)果。
代碼段2
func main() { ch := make(chan int, 10) for i := 0; i < 10; i++ { go func() { ch <- i }() } for range ch { <-ch } fmt.Println(1111) }
猜想下代碼2會(huì)打印什么結(jié)果。
自己可以運(yùn)行下,
代碼段1會(huì)正常運(yùn)行, 代碼段2會(huì)死鎖, 納尼,不一樣吧,的確就是不一樣。
請注意:代碼段1 channels 是一個(gè)切片類型哦。
總結(jié)一下
channel 支持 for range 的方式進(jìn)行遍歷,需要注意兩個(gè)細(xì)節(jié)。
1.在遍歷時(shí),如果 channel 沒有關(guān)閉,則回出現(xiàn) deadlock 的錯(cuò)誤。
2.在遍歷時(shí),如果 channel 已經(jīng)關(guān)閉,則會(huì)正常遍歷數(shù)據(jù),遍歷完后,就會(huì)退出遍歷。
3.對(duì)于nil channel,無論收發(fā)都會(huì)被阻塞。
4.寫完 chan 之后一定要關(guān)閉close chan,否則主協(xié)程讀的時(shí)候,會(huì)發(fā)生被阻塞。
5.已關(guān)閉的Channel(有緩沖的),如果繼續(xù)讀數(shù)據(jù),得到的是零值(對(duì)于int,就是0), 如果沒有關(guān)閉,讀不到數(shù)據(jù)了。
- select語句中除default外,每個(gè)case操作一個(gè)channel,要么讀要么寫。
- select語句中除default外,各case執(zhí)行順序是隨機(jī)的。
- select語句中如果沒有default語句, 則會(huì)阻塞等待任一case。
- select語句中讀操作要判斷是否成功讀取,關(guān)閉的channel也可以讀取.
遍歷 chan 與 遍歷切片類型是不一樣的。
以上就是Go channel range使用示例深度理解的詳細(xì)內(nèi)容,更多關(guān)于Go channel range的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go?web中cookie值安全securecookie庫使用原理
這篇文章主要為大家介紹了Go?web中cookie值安全securecookie庫使用及實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11GO語言gin框架實(shí)現(xiàn)管理員認(rèn)證登陸接口
這篇文章主要介紹了GO語言gin框架實(shí)現(xiàn)管理員認(rèn)證登陸接口,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Go切片導(dǎo)致rand.Shuffle產(chǎn)生重復(fù)數(shù)據(jù)的原因與解決方案
在 Go 語言的實(shí)際開發(fā)中,切片(slice)是一種非常靈活的數(shù)據(jù)結(jié)構(gòu),然而,由于其底層數(shù)據(jù)共享的特性,在某些情況下可能會(huì)導(dǎo)致意想不到的 Bug,本文將詳細(xì)分析 rand.Shuffle 之后,切片中的數(shù)據(jù)出現(xiàn)重復(fù)的問題,探討其根本原因,并給出最佳解決方案,需要的朋友可以參考下2025-02-02Go語言實(shí)現(xiàn)一個(gè)簡單生產(chǎn)者消費(fèi)者模型
本文主要介紹了Go語言實(shí)現(xiàn)一個(gè)簡單生產(chǎn)者消費(fèi)者模型,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12golang 對(duì)私有函數(shù)進(jìn)行單元測試的實(shí)例
這篇文章主要介紹了golang 對(duì)私有函數(shù)進(jìn)行單元測試的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05