zoukankan      html  css  js  c++  java
  • go学习笔记day21

    并发是 go 的强大能力之一

    channel 做 gorountine 的通信, 

    定义带缓存的channel,(当缓存满时阻塞发生在缓存区)

    Go 并发

    Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。

    goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

    package main
    
    import (
            "fmt"
            "time"
    )
    
    func say(s string) {
            for i := 0; i < 5; i++ {
                    time.Sleep(100 * time.Millisecond)
                    fmt.Println(s)
            }
    }
    
    func main() {
            go say("world")
            say("hello")
    }

    // 会看到输出的 hello 和 world 是没有固定先后顺序

      

    通道(channel)

    通道(channel)是用来传递数据的一个数据结构。

    通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯

    <-  :   指定通道的方向

    ch := make(chan int)   
    ch := make(chan int, 100) // 带缓冲区, 缓冲区 100   存取可以不同步  (阻塞发生在缓冲区)

      

    package main
    
    import "fmt"
    
    func main() {
        // 这里我们定义了一个可以存储整数类型的带缓冲通道
            // 缓冲区大小为2
            ch := make(chan int, 2)
    
            // 因为 ch 是带缓冲的通道,我们可以同时发送两个数据
            // 而不用立刻需要去同步读取数据
            ch <- 1
            ch <- 2
    
            // 获取这两个数据
            fmt.Println(<-ch)
            fmt.Println(<-ch)
    }
    

      

    Go 遍历通道与关闭通道

    Go 通过 range 关键字来实现遍历读取到的数据,类似于与数组或切片

    v, ok := <-ch

    如果通道接收不到数据后 ok 就为 false,这时通道就可以使用 close() 函数来关闭

      

    package main
    
    import (
            "fmt"
    )
    
    func fibonacci(n int, c chan int) {
            x, y := 0, 1
            for i := 0; i < n; i++ {
                    c <- x    // 把数据存到通道内
                    x, y = y, x+y
            }
            close(c)
    }
    
    func main() {
            c := make(chan int, 10)
            go fibonacci(cap(c), c)
            // range 函数遍历每个从通道接收到的数据,因为 c 在发送完 10 个
            // 数据之后就关闭了通道,所以这里我们 range 函数在接收到 10 个数据
            // 之后就结束了。如果上面的 c 通道不关闭,那么 range 函数就不
            // 会结束,从而在接收第 11 个数据的时候就阻塞了。
            for i := range c {
                    fmt.Println(i)
            }
    }
    

      

    ~~~

    下面是gogLang的开发工具,这几天没有休息好,导致一连串的疲乏,好好休息

  • 相关阅读:
    ArcGis面要素空间连接,取相交面积最大者 C#
    迅雷下载器无限制版_无敏感_无限速
    redhat 6.8 配置 centos6 163 的 yum 源
    apache cgi 程序: End of script output before headers
    centos php 安装 decrypt
    url传输中+转为%2B取到变空格的问题
    快速搭建自己的搜索引擎
    ffmpeg 文件推流 rtsp和rtmp
    svn 服务器操作
    edusoho迁移
  • 原文地址:https://www.cnblogs.com/baota/p/15701993.html
Copyright © 2011-2022 走看看