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


    //斐波那契数列
    //1 1 2 3 5 8
    //观察规律
    //第一轮:前两个数是1,1,相加等于2
    //第二轮:第二个数和第三个数是1,2,相加等于3
    //第三轮:第三个数和第四个数是2,3,相加等于5
    //第四轮:第四个数和第五个数是3,5,相加等于8
    //也就是说两个数相加的和,和前面的数相加
    
    package main
    
    import (
        "fmt"
    )
    
    //ch只写,quit只读
    func fibonacci(ch chan<- int, quit <-chan bool) {
        x, y := 1, 1
        for {
            //监听channel数据的流动
            select {
            case ch <- x: //往里写 。第一次写的时候是1,如果没有地方读的话,那么这里会阻塞
                x, y = y, x+y //第一次是往ch写1,y的值也是1,下一次y的值就是x+y
            case flag := <-quit:  //
                fmt.Println("flag = ", flag)
                return
            }
        }
    }
    
    func main() {
        ch := make(chan int)    //数字通道
        quit := make(chan bool) //程序是否结束
    
        //消费者,从channel读取内容
        //新建协程
        go func() {
            for i := 0; i < 8; i++ {
                num := <-ch      //这里读是因为防止select那里会阻塞
                fmt.Println(num)
            }
            //可以停止
            quit <- true
        }() //别忘了()
    
        //生产者,产生数字,写入channel
        fibonacci(ch, quit)
    
    }
    1
    1
    2
    3
    5
    8
    13
    21
    flag =  true

    上面是使用select,下面用普通函数实现

    package main
    
    import (
        "fmt"
    )
    
    func Fibonacci() func() int {
        a, b := 0, 1
        return func() int {
            a, b = b, a+b
            return a
        }
    }
    
    func main() {
    
        f := Fibonacci()
        fmt.Println(f())
        fmt.Println(f())
        fmt.Println(f())
        fmt.Println(f())
        fmt.Println(f())
        fmt.Println(f())
        fmt.Println(f())
        fmt.Println(f())
        fmt.Println(f())
        fmt.Println(f())
    }
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
  • 相关阅读:
    Linux 下 发布jar
    Jquery判断浏览器版本
    根据2个字符串得到2个串之间的连续数 并返回list
    Eclipse中user library包管理
    /bin/sh^M: bad interpreter: No such file or directory AND 使用Shell脚本查找程序对应的进程ID,并杀死进程
    split方法为空判断
    apache common 工具
    fmt:message key为el表达式 fmt其他格式化
    集群
    shell脚本控制jar的启动和停止
  • 原文地址:https://www.cnblogs.com/wt645631686/p/9690251.html
Copyright © 2020-2023  润新知