Golang 入門系列(六)理解Go協程Goroutine,這篇就夠了

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

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

Golang 入門系列(六)理解Go協程Goroutine,這篇就夠了

什麼是Go協程

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

Go 協程之間通過信道(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")
}/<code>

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

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

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


Channel(管道)

Channel(管道) 可以被認為是協程之間通信的管道。與水流從管道的一端流向另一端一樣,數據可以從信道的一端發送並在另一端接收。

1. 定義

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

a. 我們需要通過內置函數 make 來創建一個信道。

<code>var ch chan int/<code>

b. 與其他變量定義一樣,快速聲明也是定義信道的一種有效而簡潔的方式:

<code>a := make(chan int)/<code>

c. 創建一個帶緩衝的channel

<code>c := make(chan int, 1024)

// 從帶緩衝的channel中讀數據
for i:=range c {
  ...
}/<code>

3. 發送和接收數據

通過信道發送和接收數據的語法如下:

<code>data := a /<code>

箭頭的指向說明了數據是發送還是接收,是不是特別簡單?

完整例子

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

<code>
package main

import (
"fmt"
"time"
)

func Producer(queue chan for i := 0; i < 10; i++ {
queue fmt.Println("create :", i)
}
}

func Consumer(queue for i := 0; i < 10; i++ {
v := fmt.Println("receive:", v)
}
}

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

最後

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



分享到:


相關文章: