判断 channel 是否关闭
语法:v, ok := <-ch
说明:
ok 为 true,读到数据,管道没有关闭
ok 为 false,管道已关闭,没有数据可读
示例:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
go test(ch)
for {
if v, ok := <-ch; ok {
fmt.Println("get val: ", v, ok)
} else {
break
}
}
}
func test(ch chan int) {
for i := 0; i < 5; i++ {
ch <- i
fmt.Println("set val-----", i)
}
close(ch) //如果注释这一句会怎样呢?答案是deadlock
}
运行结果:
set val----- 0
get val: 0 true
get val: 1 true
set val----- 1
set val----- 2
get val: 2 true
get val: 3 true
set val----- 3
set val----- 4
get val: 4 true
Program exited.
range 可以遍历数组,map,字符串,channel等。
一个发送者可以关闭 channel,表明没有任何数据发送给这个 channel 了。接收者也可以测试channel是否关闭,通过 v, ok := <-ch 表达式中的 ok 值来判断 channel 是否关闭。上一节已经说明 ok 为 false 时,表示 channel 没有接收任何数据,它已经关闭了。
注意:仅仅只能是发送者关闭一个 channel,而不能是接收者。给已经关闭的 channel 发送数据会导致 panic。
Note: channels 不是文件,你通常不需要关闭他们。那什么时候需要关闭?当要告诉接收者没有值发送给 channel 了,这时就需要了。
比如终止 range 循环。
当 for range或者无条件的for 遍历 channel 时,如果发送者没有关闭 channel 或在 range 之后关闭,都会导致 deadlock(死锁)。
|