Go-BufferChannel-Select-基础理解

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

上一篇文章讲了 协程与管道

这篇主要讲Select这个有用的关键字用来监听管道顺带讲下带缓冲的Channel


带缓冲的Channel

Channel是可以带有缓冲的 c := make(chan int,3) 这么声明则代表这个管道里最多同时可以放三个int类型的数据

如下代码所示 

package main

func main() {
	c := make(chan int,3)
	c <- 1
	c <- 1
	c <- 1
<span style="white-space:pre">	</span>//c <- 1 如果再加上这一句则会报错 因为无法同时放入四个int类型数据
	<- c
	<- c
	<- c
}

Select 

Go提供了select关键字用于监听各个通道 

比如我要取通道1中的数据并且是一有数据我就取出来 那我们该如何实现呢 

这是就可以借助select 用来监听一旦有数据进来select自动帮你取数据出来 还是挺方便的一个功能

package main

import (
	"time"
	"fmt"
)

func main() {
	o := make(chan int)
	c := make(chan int)

	go func() {
		for {
			select {
			case a := <- c://监听c管道只要一有数据进来 就打印出来
				fmt.Println(a)
			//这里After返回 <-chan Time 也就是监听 <-chan Time这个管道
			//如果超过5秒钟 如果select一直未收到消息 那么 就会给<-chan Time通道发送一个消息
			//每隔5秒就会发送一次
			case <- time.After(5 * time.Second):
				o <- 0
				break //仅仅是跳出select循环并未跳出for循环
			}
		}
	} ()
	for i := 0; i<100 ; i++{
		c <- i
	}
	<- o //接收消息
}





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

本文来自:CSDN博客

感谢作者:u012807459

查看原文:Go-BufferChannel-Select-基础理解

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

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