goroutine 返回值_Golang 入門系列(六)理解Go協程Goroutine,這篇就夠了!
技術標籤:goroutine 返回值
前面講介紹了Go 語言的基礎知識,Golang的基礎語法以及Golang的主要特性Interface等。感興趣的朋友可以先看看之前的文章。這些都是Golang的基礎內容,必須熟練掌握。
接下來講講Golang的核心功能,也是go語言重要的特性:Go協程(Goroutine)。
![33a221b7661ca3fdaf28eee0ec1be96c.png](https://img.796t.com/res/2021/01-04/03/cff379ff51f844df3331d6458288b361.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實現負載均衡