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

相关文章

  • 文章收藏

    channel Go Channel 详解

  • Golang Channel底层实现

    Go Channel 底层实现 目录 channel 是什么 channel 的创建 channel 的发送 ch...

  • 26.Go语言·管道Channel

    main.go model/Channel.go

  • Go语言——channel详解

    Go语言——channel详解 channel和goroutine是go语言最具特色是结构,有必要仔细研究。 源码...

  • golang学习笔记--channel

    go中的channel channel是类型相关的 声明var channame chan chantype 定义...

  • channel in Go's runtime

    http://skoo.me/go/2013/09/20/go-runtime-channel/

  • Go channel

    单纯地将函数并发执行是没有意义的,函数与函数之间需要交换数据才能体现并发执行函数的作用。虽然可使用共享内存进行数据...

  • go channel

    [toc] Channel 编译器翻译 关键数据结构 hchan sudog hchan sudog 其中buf ...

  • go channel

    浅析 go channel channel 是 goroutine 之间通信的一种方式,可以类比成 Unix 中的...

  • go channel

    channel channel一般用于goroutine之间的通信;初始化chan :=make(chan int...

网友评论

      本文标题:go的channel

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