Golang 入門系列(六)理解Go中的協程(Goroutine)

前面講的都是一些Go 語言的基礎知識,感興趣的朋友能夠先看看以前的文章。https://www.cnblogs.com/zhangweizhong/category/1275863.htmlhtml

今天就來說講go 裏面的高級功能,也是go語言重要的特性:Go協程(Goroutine)。併發

 

什麼是Go協程

Go協程(Goroutine)是與其餘函數同時運行的函數。能夠認爲Go協程是輕量級的線程,由Go運行時來管理。函數

在函數調用前加上go關鍵字,此次調用就會在一個新的goroutine中併發執行。當被調用的函數返回時,這個goroutine也自動結束。聽着感受像C# 中的Task。spa

須要注意的是,若是這個函數有返回值,那麼這個返回值會被丟棄。線程

 

Go 協程(Goroutine)之間經過信道(channel)進行通訊,簡單的說就是多個協程之間通訊的管道。信道能夠防止多個協程訪問共享內存時發生資源爭搶的問題。code

 

如何使用

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. 定義htm

每一個channel都有一個類型。此類型是容許信道傳輸的數據類型。channel是類型相關的,一個channel只能傳遞一種類型的值,這個類型須要在聲明channel時指定。blog

 

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("create :", i)
    }
}

func Consumer(queue <-chan int) {
    for i := 0; i < 10; i++ {
        v := <-queue  // 讀出
        fmt.Println("receive:", v)
    }
}

func main() {
    queue := make(chan int, 88)
    go Producer(queue)
    go Consumer(queue)
    time.Sleep(1 * time.Second)
}

 

最後

以上,就簡單的介紹了Go語言中的協程(Goroutine)和信道(channel)。這兩個功能特性,是go語言中重要的特性。你們能夠寫寫其餘的例子,熟悉掌握。

相關文章
相關標籤/搜索