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

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

Goroutines select with range loop

Goroutines select with range loop

Go
慕工程0101907 2023-05-15 15:14:00
我想生成一個 goroutine 來收聽類型chan int和的兩個通道chan os.Signal。我希望行為具體取決于在任一渠道上收到的內容。這意味著有些os.Signal可能會導致os.exit(),有些可能不會,有些int接收到的chan int可能會打印一條語句,有些可能會調用一個函數,所以我需要這個 gorountine 始終運行,因為行為不同。我希望這一切都由一個函數處理。我很難弄清楚如何在語法上實現這一目標。似乎我不能在塊range內有循環select,我也不能在循環select內有塊range。我在網上找不到任何資源。有人可以給我舉個例子嗎?
查看完整描述

1 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

您可以將select語句放入循環中for(這是語言規范中的示例之一)。與循環不同for...range,這將讓您從兩個通道讀取。如果其中一個通道關閉,它也不會自動終止。當您從關閉的通道接收時,關閉的通道始終準備好接收并始終產生零值,并且它有一個二值形式告訴您通道是否打開。


你的功能可能看起來像


func HandleStuff(numbers <-chan int, signals <-chan os.Signal) {

? ? var goingToExit bool

? ? for {

? ? ? ? select {

? ? ? ? case n := <-numbers:

? ? ? ? ? ? if n == 0 {

? ? ? ? ? ? ? ? fmt.Printf("zero\n")

? ? ? ? ? ? } else if n == 1 {

? ? ? ? ? ? ? ? goingToExit = true

? ? ? ? ? ? }

? ? ? ? case sig, ok := <-signals:

? ? ? ? ? ? if !ok { // the channel is closed

? ? ? ? ? ? ? ? return

? ? ? ? ? ? } else if goingToExit {

? ? ? ? ? ? ? ? os.Exit(0)

? ? ? ? ? ? }

? ? ? ? }

? ? }

}


查看完整回答
反對 回復 2023-05-15
  • 1 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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