同一個channel, 我需要在多個goroutine中send, 在一個goroutine中receive, 并且我可以隨時關(guān)閉這個channel, 問題是如果我關(guān)閉channel后還有send, 就會導(dǎo)致一個panic.網(wǎng)上找到的一個方法是panic后再recoverfunc SafeSend(ch chan T, value T) (closed bool) { defer func() { if recover() != nil { // the return result can be altered // in a defer function call closed = true } }() ch <- value // panic if ch is closed return false // <=> closed = false; return}因為不想用recover,問一下還有沒有更加優(yōu)雅的方式去實現(xiàn)
2 回答

不負(fù)相思意
TA貢獻(xiàn)1777條經(jīng)驗 獲得超10個贊
同一個channel, 需要在多個goroutine中send的話應(yīng)該用緩沖區(qū)chan。
recover是盡量不用的,因此,應(yīng)該在sender之前就做判斷
題主應(yīng)該是之前用過一段時間的其他語言,并且接觸go不久,因此在錯誤處理的思路上,還不太符合go的特點。
與大多數(shù)語言不同,用try...catch...等機(jī)制來做錯誤處理,go建議大家不要輕易使用recover,而是用返回err對象來處理。因此,在可能出現(xiàn)panic的語句之前,盡量用能夠返回err的函數(shù)去檢查可能出現(xiàn)的錯誤!

幕布斯6054654
TA貢獻(xiàn)1876條經(jīng)驗 獲得超7個贊
通過一個chan
來通知這些生產(chǎn)者退出,用WaitGroup
等待這些生產(chǎn)者退出,最后關(guān)閉這個主chan
- 2 回答
- 0 關(guān)注
- 1630 瀏覽
添加回答
舉報
0/150
提交
取消