1. 程式人生 > GO語言入門 >21 Go 語言的通道

21 Go 語言的通道

1. 通道的宣告和定義

通道可以理解為一種特殊的變數,所以它的宣告和其它變數的宣告並沒有太大的區別,宣告通道變數的寫法如下:

var c chan int //宣告一個存放int型別資料的通道

但是它宣告之後並不能直接使用,需要使用內建函式 make() 來建立一下通道變數才可以使用:

Tips:由於chan的底層是一個指標,在Go語言中指標初始值為空,是需要例項化的。make就是示例化了chan。

var c chan int //宣告一個存放int型別資料的通道
c = make(chan int, 1) //建立一個長度為1的通道

在這種情況下最好使用:=來同時宣告和建立:

c := make
(chan int, 1) //宣告並建立一個存放int型別資料的通道

2. 通道的使用

在 Go 語言中,使用 <- 符號來向通道中塞取資料。放在通道右邊 chan <-,就是塞資料,放在通道左邊 <- chan ,就是取資料。

程式碼示例

func main() {
    c := make(chan int, 1) 
    c <- 10 //將10塞入通道中
    i := <-c //將10從通道中取出,並賦值給變數i
    fmt.Println(i)
}

執行結果

圖片描述

3. 通道結合 select 流程控制

在 Go 語言中為了更方便的利用通道的功能,提供了一個僅用於通道的流程控制語句:select...case

。使用這個語句可以同時監聽數個通道,非常適合用於併發時的程序排程,或者模組之間的解耦合。這些在後續的文章中會有詳細介紹,下面通過一個簡單的例子來了解一下 select...case 語句。

程式碼示例

package main

import "fmt"

func main() {
    c := make(chan int, 1)

    for a := 0; a < 2; a++ {
        select {
        case i := <-c:
            fmt.Println("從通道中取出", i)
        case c <-
10: fmt.Println("將 10 塞入通道中") } } }
  • 第 8 行:寫一個兩次的迴圈,若是在多執行緒中,一般寫成死迴圈;
  • 第 9 行:select 關鍵字做為 select 語句的起始;
  • 第 10 行:若 c 通道中存在資料,則取出,並執行後續語句;
  • 第 12 行:若通道未滿,將 10 塞入通道中。

Tips:select語句和switch語句一樣,case都只會執行一個,然後立刻跳出語句

執行結果

圖片描述

4. 小結

本文介紹了 Go 語言中特有的型別通道(chan)的用法,以及select...case這個 Go 語言中獨有的流程控制語句。通道使用的時候注意需要 make() 內建函式先建立,不然只是個空指標,無法使用。select...casecase 之後只能跟獲取通道資料或者塞資料進通道