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
超时
程序结束
 */

  

select实现斐波那契和超时机制的更多相关文章

  1. go语言之进阶篇通过select实现斐波那契数列

    一.select作用 Go里面提供了一个关键字select,通过select可以监听channel上的数据流动. select的用法与switch语言非常类似,由select开始一个新的选择块,每个选 ...

  2. [GO]使用select实现斐波那契

    package main import "fmt" func fibonacci(ch chan <- int, quit <- chan bool) { x, y : ...

  3. Golang利用select和普通函数分别实现斐波那契数列

    //斐波那契数列 //1 1 2 3 5 8 //观察规律 //第一轮:前两个数是1,1,相加等于2 //第二轮:第二个数和第三个数是1,2,相加等于3 //第三轮:第三个数和第四个数是2,3,相加等 ...

  4. 在sqlserver中做fibonacci(斐波那契)规律运算

    --利用sqlserver来运算斐波那契规律 --利用事物与存储过程 declare @number intdeclare @A intdeclare @B intdeclare @C int set ...

  5. 《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列

    斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...

  6. UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

    大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵 ...

  7. hdu 2044:一只小蜜蜂...(水题,斐波那契数列)

    一只小蜜蜂... Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepte ...

  8. C++求斐波那契数

    题目内容:斐波那契数定义为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n>1且n为整数) 如果写出菲氏数列,则应该是: 0 1 1 2 3 5 8 13 21 34 …… ...

  9. 爬楼梯问题-斐波那契序列的应用.md

    N 阶楼梯,一次可以爬1.2.3...n步,求爬楼梯的种类数 /** * 斐波那契序列 */ public class ClimbingStairs { // Sol 1: 递归 // 递归 公式:F ...

随机推荐

  1. liniux备忘录-磁盘配额与进阶文件系统管理

    知识 磁盘配额Quota 可以限制磁盘的使用容量,可以对用户.群组磁盘的最大使用容量. 磁盘配额Quota的使用限制 只能针对整个文件系统. 核心必须支持Quota. 自行编译的核心需要注意 Quot ...

  2. MFC MDI 工程禁用win7任务栏(taskbar)多视图缩略图(preview)功能

    花费了好几天,google上的把搜索关键字都想烂了终于搜出了答案 app的init函数中在创建mainframe之前调用 EnableTaskbarInteraction(FALSE);

  3. 【PHP】- 魔术常量

    PHP 向它运行的任何脚本提供了大量的预定义常量.不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了.有八个魔术常量它们的值随着它们在代 ...

  4. [剑指Offer] 19.顺时针打印矩阵

    [思路]本题关键在于 右->左 和 下->上 两个循环体中的判断条件,即判断是否重复打印. class Solution { public: vector<int> print ...

  5. 【bzoj3379】[Usaco2004 Open]Turning in Homework 交作业 区间dp

    题目描述 数轴上有C个点,每个点有一个坐标和一个访问时间,必须在这个时间后到达这个点才算访问完成.可以在某个位置停留.每在数轴上走一个单位长度消耗一个单位的时间,问:访问所有点并最终到B花费的最小时间 ...

  6. Eclipse打不开,闪退

    自己编写了个程序,运行巨慢..无语,输出太多,后来冒出一个错误,不知什么原因啊,再后来Eclipse就打不开了,到workbench闪退... 百度后解决方案: 进入目录:workspace/.met ...

  7. BZOJ3529 [Sdoi2014]数表 【莫比乌斯反演】

    3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2151 Solved: 1080 [Submit][Status ...

  8. 【BZOJ 1770 】 [Usaco2009 Nov]lights 燈 dfs+异或方程组

    这道题明显是异或方程组,然而解不一定唯一他要的是众多解中解为1的数的最小值,这个时候我们就需要dfs了我们dfs的时候就是枚举其有不确定解的数上选0或1从而推知其他解,由于我们dfs的时候先0后1,虽 ...

  9. [COGS 1535] [ZJOI2004]树的果实 树状数组+桶

    我们用树状数组做差就可以解决一切问题,我用桶排并用此来表示出第几大就可以直接求前缀和了 #include<cstdio> #include<algorithm> #define ...

  10. Light OJ 1074:Extended Traffic(spfa判负环)

    Extended Traffic 题目链接:https://vjudge.net/problem/LightOJ-1074 Description: Dhaka city is getting cro ...