美文网首页
go的channel

go的channel

作者: Zeaone | 来源:发表于2020-06-27 16:08 被阅读0次

    一 介绍

    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 示例其实就是一个简单的生产者-消费者模型实现。

    相关文章

      网友评论

          本文标题:go的channel

          本文链接:https://www.haomeiwen.com/subject/xgloahtx.html