Golang channel關(guān)閉的實(shí)現(xiàn)示例
使用內(nèi)置函數(shù)close可以關(guān)閉channel,當(dāng)channel關(guān)閉后,就不能再向channel寫數(shù)據(jù)了,但是仍然可以從channel中讀取數(shù)據(jù)。
一旦將channel關(guān)閉了,只能讀不能寫。相當(dāng)于關(guān)閉管道就數(shù)據(jù)不能進(jìn)入到隊(duì)列里面了,只能進(jìn)行讀操作,只讀不寫。
channel支持for-range的方式進(jìn)行遍歷,請(qǐng)注意兩個(gè)細(xì)節(jié)
(1)在遍歷時(shí),如果channel沒有關(guān)閉,則回出現(xiàn)deadlock的錯(cuò)誤
(2)在遍歷時(shí),如果channel已經(jīng)關(guān)閉,則會(huì)正常遍歷數(shù)據(jù),遍歷完后,就會(huì)退出遍歷。
下面這種遍歷方式肯定是錯(cuò)誤的,每次取出來數(shù)據(jù)長度都會(huì)減1,容量方式也一樣不是真實(shí)的長度,所以只能使用for rang方式。
func main() { intChan := make(chan int, 3) intChan <- 100 intChan <- 200 close(intChan) //關(guān)閉管道 //當(dāng)管道關(guān)閉之后,讀取數(shù)據(jù)是沒有問題的 num := <-intChan fmt.Println(num) //從管道里面依次取出這樣的值,管道是先進(jìn)先出的隊(duì)列,值也是按照順序取出來的 for v := range intChan { fmt.Println(v) } }
func main() { intChan := make(chan int, 3) //向管道寫入數(shù)據(jù) intChan <- 1 num := 2 intChan <- num for i := 0; i < 1; i++ { v, ok := <-intChan fmt.Println(v, ok) } fmt.Println(".....................") close(intChan) for i := 0; i < 10; i++ { v, ok := <-intChan fmt.Println(v, ok) } } 1 true ..................... 2 true 0 false 0 false 0 false 0 false 0 false 0 false 0 false 0 false 0 false
到此這篇關(guān)于Golang channel關(guān)閉的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Golang channel關(guān)閉內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang?四則運(yùn)算計(jì)算器yacc歸約手寫實(shí)現(xiàn)
這篇文章主要為大家介紹了golang?四則運(yùn)算?計(jì)算器?yacc?歸約的手寫實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Golang實(shí)現(xiàn)微信公眾號(hào)后臺(tái)接入的示例代碼
這篇文章主要介紹了Golang實(shí)現(xiàn)微信公眾號(hào)后臺(tái)接入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02golang中defer執(zhí)行時(shí)機(jī)的案例分析
這篇文章主要來通過一些案例和大家一起探討一下golang中defer的執(zhí)行時(shí)機(jī),文中的示例代碼講解詳細(xì),對(duì)我們深入了解golang有一定的幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下2023-11-11