golang的chan特性

minwell · · 1340 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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