• 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
  • 相关阅读:
    只会写“Hello World”的菜鸟心声
    新的旅程
    生成[1,2,,3,4,5,6,7,8,9]的随机数组?
    计算java集合中自定义对象出现的次数
    iOS https 证书信任漏洞解决办法
    自定义 URL Scheme 完全指南
    Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
    url schemes格式错误
    给UITapGestureRecognizer添加tag
    iOS GIF 格式动画 图片显示
  • 原文地址:https://www.cnblogs.com/wt645631686/p/9690251.html
Copyright © 2020-2023  润新知