package main

import "fmt"

func fib(ch chan <-int, quit <- chan bool){
	x, y := 1, 1
	for {
		//监听channel的流动
		select {
		case ch <- x:
			x, y = y, x+y
		case flag := <-quit:
			fmt.Println("flag=", flag)
			return

		}
	}
}

func main(){
	ch := make(chan int)
	quit:=make(chan bool)
	go func() {
		for i:=0;i<8;i++{
			num:=<-ch
			fmt.Println(num)
			/*
			1
			1
			2
			3
			5
			8
			13
			21
			flag= true
			 */
		}
		quit <- true
	}()
	fib(ch, quit)
}

/*
分析一下代码的逻辑
首先,对于select,是用来监听管道的流动,多个case,那么能执行,就执行哪个,如果都能执行会随机选择一个
对于case ch<-x,会先往ch里面写进去一个1。然后在子协程中num会接收到。此时x, y = y, x+y,然后继续往ch里面放入数据,然后num接收
当子协程里的for循环执行完毕,那么对于case ch<-x,即便往ch里面放入数据,也没办法取了,因为循环结束了,无法执行num:= <- ch了
所以对于第一个case就卡在那里了,会一直等待着有人把ch里面的数据取走.
然后设置quit<-true,一开始第二个case flag:= <- quit里面是没有数据的,当我们设置值之后有数据了,那么便可以取了,会取到flag=true
然后执行第二个case里面的语句,return结束函数,从而结束程序。
需要注意的是:如果想跳出函数,在select里面不要使用break,因为break也对select起作用,使用break跳出select,但并没有跳出for循环,然后会又来执行select
 */

  

package main

import (
	"fmt"
	"time"
)

func main()  {
	ch := make(chan int)
	quit := make(chan bool)

	go func() {
		for {
			select {
			case num:=<-ch:
				fmt.Println(num)
			case <-time.After(time.Second * 3):
				fmt.Println("超时")
				quit <- true
			}
		}
	}()
	for i:=0;i<5;i++{
		ch <- i
	}
	<-quit//主协程会卡在这里,直到超时
	fmt.Println("程序结束")
}
/*
0
1
2
3
4
超时
程序结束
 */

  

最新文章

  1. IBatis存储过程返回值
  2. compass General 常用api学习[Sass和compass学习笔记]
  3. 体验极速Android SDK的更新与下载
  4. 转:DataSet、DataTable、DataRow、DataColumn区别及使用实例
  5. HDU 4998 Rotate --几何
  6. ionic cordova file download and load
  7. short-path problem (Dijkstra) 分类: ACM TYPE 2014-09-01 23:51 111人阅读 评论(0) 收藏
  8. Android:开发环境
  9. Response对象
  10. Hadoop书籍下载链接
  11. Android Studio 3.0 使用问题解决方案总结
  12. pymysql 详解
  13. [unix]commvault在unix系统上本地安装报“NFS directory cannot be used”
  14. Spring源码学习(6)——容器的功能扩展
  15. win10开机自启动
  16. Django 学习第五天——自定义过滤器及标签
  17. PAT A1145 Hashing - Average Search Time (25 分)——hash 散列的平方探查法
  18. C语言第四次实验
  19. [ 转载 ] Java中常用的设计模式
  20. 谨慎安装Python3.7.0,SSL低版本导致Pip无法使用

热门文章

  1. npm安装不成功的原因
  2. 关于c++的头文件依赖
  3. Spark实战练习02--处理分隔符
  4. 算法(6)3Sum Closest
  5. Javascript中闭包常用场景
  6. iOS进阶--提高XCode编译速度、Xcode卡顿解决方案
  7. hdu 1787 GCD Again (欧拉函数)
  8. LeetCode -- 3SumCloset
  9. 如何使用Navicat恢复数据库脚本
  10. bzoj4589 FWT xor版本