|
|
@@ -27,7 +27,7 @@ if v, ok := <-ch; ok {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-或者在 for 循环中接收的时候,当关闭或者阻塞的时候使用 break:
|
|
|
+或者在 for 循环中接收的时候,当关闭的时候使用 break:
|
|
|
|
|
|
```go
|
|
|
v, ok := <-ch
|
|
|
@@ -37,6 +37,21 @@ if !ok {
|
|
|
process(v)
|
|
|
```
|
|
|
|
|
|
+而检测通道当前是否阻塞,需要使用 select(参见第 [14.4](14.4.md) 节)。
|
|
|
+
|
|
|
+```go
|
|
|
+select {
|
|
|
+case v, ok := <-ch:
|
|
|
+ if ok {
|
|
|
+ process(v)
|
|
|
+ } else {
|
|
|
+ fmt.Println("The channel is closed")
|
|
|
+ }
|
|
|
+default:
|
|
|
+ fmt.Println("The channel is blocked")
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
在示例程序 14.2 中使用这些可以改进为版本 goroutine3.go,输出相同。
|
|
|
|
|
|
实现非阻塞通道的读取,需要使用 select(参见第 [14.4](14.4.md) 节)。
|