go-通道channel

通道

两种配合方式:

  • range
  • select

range 方式

1
2
3
4
//关闭之后会跳出循环
for v:=range c{
//todo
}

select 方式

1
2
3
4
5
6
for {
select {
case val,ok:=<-c:
if !ok{break}
}
}

Close(ch)含义

给通道写了一个结束标识值,接收到这个值表示通道已经关闭,有这个值就不能再写入了,还可以继续读取,读取到这个值的时候就表示已经读取完了,通道为空了。

注意点

  • 从一个 nil channel 中接收数据会一直被 block。

  • 从一个被 close 的 channel 中接收数据不会被阻塞,而是立即返回,接收完已发送的数据后会返回元素类型的零值(zero value)。

1
2
3
//如果OK 是false,表明接收的x是产生的零值,这个channel被关闭了或者为空。
//从这个关闭的channel中不但可以读取出已发送的数据,还可以不断的读取零值(使用range或者判断是否关闭可以跳出)
x, ok := <-ch