golang的chan特性

minwell · 2020-11-28 16:18:58 · 1498 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2020-11-28 16:18:58 的文章,其中的信息可能已经有所发展或是发生改变。

go routine之间可以通过channel来通信。

1、单向channel&双向channel

<-chan只能用来发送的单向channel;chan<-只能用来接收的单向channel;chan双向channel 向<-chan发送数据 或者 接收chan<-的数据;编译失败

    var cc = make(<-chan int)
    close(cc)
    cc <- 23
# command-line-arguments
.\main.go:48:7: invalid operation: close(cc) (cannot close receive-only channel)
.\main.go:49:5: invalid operation: cc <- 23 (send to receive-only type <-chan int)
    var cc = make(chan<- int)
    v:= <-cc
# command-line-arguments
.\main.go:49:6: invalid operation: <-cc (receive from send-only type chan<- int)

单向channel的应用场景是什么呢,回头研究一下。

2、channel的声明 声明一个传输整形的buffer chan,容量为6:

var cc = make(chan int, 6)

读缓存中为空的channel和写入缓存已满的channel都是阻塞的

因此,声明channel必须指定容量,channel才"可用",否则channel的读写是阻塞的

3、channel使用完毕,使用close(c chan<- Type)关闭channel

向关闭的channel发送数据,会导致panic

    ***
    var cc = make(chan int,1)
    close(cc)
    cc <- 23
    ***

panic: send on closed channel

4、channel使用方法

cc:=make(chan int,6)
go func() {
       for i:=0;i<1000;i++{
    cc <-i
     }
}()

loop:for {
    select {
       case int1:= <- cc:
        fmt.Println(int1)
    case <-time.After(5 * time.Second):
                fmt.Println("timeout")
            break loop
    }
}
close(cc)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1498 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传