亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang中channel如何在多個goroutine中優雅(安全)的send

golang中channel如何在多個goroutine中優雅(安全)的send

Go
鳳凰求蠱 2018-10-02 19:12:29
同一個channel, 我需要在多個goroutine中send, 在一個goroutine中receive, 并且我可以隨時關閉這個channel, 問題是如果我關閉channel后還有send, 就會導致一個panic.網上找到的一個方法是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,問一下還有沒有更加優雅的方式去實現
查看完整描述

2 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

同一個channel, 需要在多個goroutine中send的話應該用緩沖區chan。

recover是盡量不用的,因此,應該在sender之前就做判斷

題主應該是之前用過一段時間的其他語言,并且接觸go不久,因此在錯誤處理的思路上,還不太符合go的特點。

與大多數語言不同,用try...catch...等機制來做錯誤處理,go建議大家不要輕易使用recover,而是用返回err對象來處理。因此,在可能出現panic的語句之前,盡量用能夠返回err的函數去檢查可能出現的錯誤!


查看完整回答
反對 回復 2018-10-14
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

通過一個chan來通知這些生產者退出,用WaitGroup等待這些生產者退出,最后關閉這個主chan

查看完整回答
反對 回復 2018-10-14
  • 2 回答
  • 0 關注
  • 1611 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號