一 介绍
1 使用
无缓冲区
ch := make(chan int)
ch<-1
<-ch
有缓冲区
ch := make(chan int , 2)
2 结论
无缓冲:发送和接收动作是同时发生的。如果没有 goroutine 读取 channel (<- channel),则发送者 (channel <-) 会一直阻塞。
带缓冲:缓冲 channel 类似一个有容量的队列。当队列满的时候发送者会阻塞;当队列空的时候接收者会阻塞。
3 关闭
重复关闭 channel 会导致 panic。
向已关闭的channel发送数据会导致panic
从已经关闭的channel中取数据,会得到对应channel类型的0值,如果是int则得到0
4 ok-idiom 方式
ch := make(chan int , 1)
close(ch)
val, ok := <- ch
if ok == false {
//channel was closed
}
二 应用场景
- goroutine 间的通信
func main() {
x := make(chan int)
go func() {
x <- 1
}()
<-x
}
2.select 中使用
3.range channel
range channel 可以直接取到 channel 中的值。当我们使用 range 来操作 channel 的时候,一旦 channel 关闭,channel 内部数据读完之后循环自动结束。
- 超时控制
在很多操作情况下都需要超时控制,利用 select 实现超时控制,下面是一个简单的示例。 - 生产者-消费者模型
利用缓冲 channel 可以很轻松的实现生产者-消费者模型。上面的 range 示例其实就是一个简单的生产者-消费者模型实现。
网友评论