在Go程序中你會一遍又一遍地看到for-select循環:
```
for { // 無限循環或遍歷
select {
// 對通道進行操作
}
}
```
比較常見的有以下幾種不同的情況:
***在通道上發送迭代變量***
通常情況下,你需要將可迭代的內容轉換為通道上的值。
```
for _, s := range []string{"a", "b", "c"} {
select {
case <-done:
return
case stringStream <- s:
}
}
```
***無限循環等待停止***
創建無限循環直到停止的例子很常見。這有一些變化。 你選擇哪一個純粹是一種偏好。
第一種變體保持select語句盡可能短:
```
for {
select {
case <-done:
return
default:
}
// 執行非搶占任務
}
```
如果done通道沒有關閉,我們會退出select語句并執行循環體剩下的部分。
第二種變體將任務嵌入到select語句的默認子句中:
```
for {
select {
case <-done:
return
default:
// 執行非搶占任務
}
}
```
當我們進入select語句時,如果done通道尚未關閉,我們將執行default子句。
這種模式沒有什么高深的地方,但它展示了最常見的使用方式,所以值得一提。
* * * * *
學識淺薄,錯誤在所難免。我是長風,歡迎來Golang中國的群(211938256)就本書提出修改意見。
- 前序
- 誰適合讀這本書
- 章節導讀
- 在線資源
- 第一章 并發編程介紹
- 摩爾定律,可伸縮網絡和我們所處的困境
- 為什么并發編程如此困難
- 數據競爭
- 原子性
- 內存訪問同步
- 死鎖,活鎖和鎖的饑餓問題
- 死鎖
- 活鎖
- 饑餓
- 并發安全性
- 優雅的面對復雜性
- 第二章 代碼建模:序列化交互處理
- 并發與并行
- 什么是CSP
- CSP在Go中的衍生物
- Go的并發哲學
- 第三章 Go的并發構建模塊
- Goroutines
- sync包
- WaitGroup
- Mutex和RWMutex
- Cond
- Once
- Pool
- Channels
- select語句
- GOMAXPROCS
- 結論
- 第四章 Go的并發編程范式
- 訪問范圍約束
- fo-select循環
- 防止Goroutine泄漏
- or-channel
- 錯誤處理
- 管道
- 構建管道的最佳實踐
- 便利的生成器
- 扇入扇出
- or-done-channel
- tee-channel
- bridge-channel
- 隊列
- context包
- 小結
- 第五章 可伸縮并發設計
- 錯誤傳遞
- 超時和取消
- 心跳
- 請求并發復制處理
- 速率限制
- Goroutines異常行為修復
- 本章小結
- 第六章 Goroutines和Go運行時
- 任務調度