1. 程式人生 > 其它 >goroutine 返回值_Golang 入門系列(六)理解Go協程Goroutine,這篇就夠了!

goroutine 返回值_Golang 入門系列(六)理解Go協程Goroutine,這篇就夠了!

技術標籤:goroutine 返回值

前面講介紹了Go 語言的基礎知識,Golang的基礎語法以及Golang的主要特性Interface等。感興趣的朋友可以先看看之前的文章。這些都是Golang的基礎內容,必須熟練掌握。

接下來講講Golang的核心功能,也是go語言重要的特性:Go協程(Goroutine)。

33a221b7661ca3fdaf28eee0ec1be96c.png

什麼是Go協程

Go協程(Goroutine)是與其他函式同時執行的函式。可以認為Go協程是輕量級的執行緒,由Go執行時來管理。不需要搶佔式排程,可以有效提高執行緒的任務併發性,而避免多執行緒的缺點;

Go 協程之間通過通道(channel)進行通訊,簡單的說就是多個協程之間可以通過管道進行通訊。這樣可以防止多個協程訪問共享記憶體時發生資源爭搶的問題。

如何使用

先看下面的例子:

package mainimport (      "fmt"    "time")func hello() {      fmt.Println("Hello world goroutine")}func main() {      go hello()    time.Sleep(1 * time.Second)    fmt.Println("main function")}

只需要在hello() 方法前加上go關鍵字,就行了。是不是特別簡單。

在函式呼叫前加上go關鍵字,Go執行時呼叫時就會在一個新的goroutine中併發執行。當被呼叫的函式返回時,這個goroutine也自動結束。聽著感覺像C# 中的Task。

需要注意的是:如果這個函式有返回值,那麼這個返回值會被丟棄。

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 := 

箭頭的指向說明了資料是傳送還是接收,是不是特別簡單?

完整例子

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

package mainimport (    "fmt"    "time")func Producer(queue chan

最後

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

推薦閱讀:

Golang 入門系列(四)Golang中的interface,一看就明白

Golang 入門系列(三)打好基本功: Golang 語法基礎!

SpringBoot入門系列(一)如何快速建立SpringBoot專案

Nginx總結(六)nginx實現負載均衡