)Golang 入门系列(六)理解Go中的协程(Goroutine)

 前面讲的都是一些Go 语言的基础知识,感兴趣的朋友可以先看看之前的文章。

package main  import (       "fmt"    "time" )  func hello() {       fmt.Println("Hello world goroutine") } func main() {       go hello()     time.Sleep(1 * time.Second)     fmt.Println("main function") }
复制代码

 

Channel(管道)

Channel(管道) 可以被认为是协程之间通信的管道。与水流从管道的一端流向另一端一样,数据可以从信道的一端发送并在另一端接收。

 

1. 定义

每个channel都有一个类型。此类型是允许信道传输的数据类型。channel是类型相关的,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。

 

2. 声明

a. 我们需要通过内置函数 make 来创建一个信道。

下面的代码声明了一个信道:

var ch chan int

 

b. 与其他变量定义一样,快速声明也是定义信道的一种有效而简洁的方式:

a := make(chan int) 

 

c. 创建一个带缓冲的channel

复制代码
c := make(chan int, 1024)  // 从带缓冲的channel中读数据for i:=range c {   ... }
复制代码

 

3. 发送和接收数据

通过信道发送和接收数据的语法如下:

复制代码
data := <- a   // 从channel a 读取数据 a <- data      // 将数据写入到 channel a 
复制代码

箭头的指向说明了数据是发送还是接收。

 

完整例子

下面就直接说说,Goroutine和channel 共同使用的完整例子:

复制代码
package main  import (     "fmt"    "time" )  func Producer(queue chan<- int) {     for i := 0; i < 10; i++ {         queue <- i //写入        fmt.Println(
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信