Go有意思小問(wèn)題匯集
有緩沖的channel沒(méi)有讀完,close后還能繼續(xù)讀出里面的內(nèi)容嗎?
可以!
讀取多次可以依次拿到之前寫入的值,直到最后讀完,繼續(xù)讀則得到對(duì)應(yīng)channel類型的0值
golang之channel入門
channel需要注意的點(diǎn):
關(guān)閉一個(gè)nil channel 會(huì)導(dǎo)致程序panic
channel關(guān)閉之后,仍然可以從channel中讀取剩余的數(shù)據(jù),直到數(shù)據(jù)全部讀取完成。讀取完后繼續(xù)讀,得到的將是對(duì)應(yīng)類型的零值.
而如果繼續(xù)向已關(guān)閉的channel發(fā)送數(shù)據(jù),會(huì)引起panic
channel不能關(guān)閉兩次,否則會(huì)panic
A->B->C三個(gè)祖孫協(xié)程,B耗時(shí)最短,B執(zhí)行結(jié)束后,C還會(huì)繼續(xù)執(zhí)行嗎?
即?Go中父協(xié)程與子協(xié)程的生命周期問(wèn)題
結(jié)論:
1. 當(dāng)父協(xié)程是main協(xié)程時(shí),父協(xié)程退出,父協(xié)程下的所有子協(xié)程也會(huì)跟著退出; (當(dāng)main協(xié)程結(jié)束時(shí),子協(xié)程也是會(huì)被終止掉的)
輸出:
2. 當(dāng)父協(xié)程不是main協(xié)程時(shí),父協(xié)程退出,父協(xié)程下的所有子協(xié)程并不會(huì)跟著退出(子協(xié)程直到自己的所有邏輯執(zhí)行完或者是main協(xié)程結(jié)束才結(jié)束)
go中父協(xié)程與子協(xié)程的生命周期(子協(xié)程能否使用主協(xié)程變量)
子協(xié)程panic,主協(xié)程還能不能正常運(yùn)行? 主協(xié)程里的recover,能捕獲子協(xié)程的panic嗎?
不能
主協(xié)程里的recover,能捕獲子協(xié)程的panic嗎?
不能~
對(duì)于goroutine中的panic,協(xié)程外面的recover是無(wú)法恢復(fù)的;goroutine中的recover,同樣無(wú)法恢復(fù)協(xié)程外的panic
Go異常處理機(jī)制panic和recover
recover哪些情況下阻止不了程序崩潰?
不能~
像
并發(fā)讀寫 map
堆棧內(nèi)存耗盡(如遞歸)
將 nil 函數(shù)作為 goroutine 啟動(dòng)
goroutines 死鎖
線程限制耗盡
超出可用內(nèi)存
會(huì)報(bào)fatal error:xxxxxxxx
recover能捕獲所有錯(cuò)誤嗎?