go的channel

一 介绍

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 示例其实就是一个简单的生产者-消费者模型实现。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •    在golang中,channel属于较为核心的一个功能,尤其在go协程中,channel功能尤为重要。作为g...
    北春南秋阅读 6,165评论 2 2
  • Channel是Go中的一个核心类型,可以把它看成一个管道,Goroutine通过它可以发送或者接收数据并进行通讯...
    taj3991阅读 2,682评论 0 2
  • Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(c...
    空即是色即是色即是空阅读 2,372评论 0 1
  • 由浅入深剖析 go channel channel 是 golang 中最核心的 feature 之一,因此理解 ...
    不智鱼阅读 60,166评论 4 83
  • go关键字可以用来开启一个goroutine(协程))进行任务处理,而多个任务之间如果需要通信,就需要用到chan...
    Ihesong阅读 9,502评论 1 5

友情链接更多精彩内容