go的channel

2020-06-27  本文已影响0人  Zeaone

一 介绍

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
}

二 应用场景

  1. goroutine 间的通信
func main() {
    x := make(chan int)
    go func() {
        x <- 1
    }()
    <-x
}

2.select 中使用

3.range channel
range channel 可以直接取到 channel 中的值。当我们使用 range 来操作 channel 的时候,一旦 channel 关闭,channel 内部数据读完之后循环自动结束。

  1. 超时控制
    在很多操作情况下都需要超时控制,利用 select 实现超时控制,下面是一个简单的示例。
  2. 生产者-消费者模型
    利用缓冲 channel 可以很轻松的实现生产者-消费者模型。上面的 range 示例其实就是一个简单的生产者-消费者模型实现。
上一篇下一篇

猜你喜欢

热点阅读