今天我們來聊一下「Channel」,中文可以翻譯為「通道」。在實作上通常與Goroutine一起,作為彼此之間的通信機制,可以收(Receive)發(Send)資料。
每個Channel可以設定一種類別,比方說一個發送整數的通道我們可定義為chan int
。在使用時我們使用內建的make
方法,範例如下:
ch := make(chan int)
宣告以後,當我們要傳遞資料進去很簡單:
ch <- 5
這樣就可以了!
在取用的時候,則是將箭頭指向變數:
x := <- ch
當通道被關閉後,資料就只出不進(還蠻直觀的),只能讀取不能寫入:
close(ch)
這樣講可能有點模糊,我們來看一個簡單的例子:
package main
import (
"fmt"
)
func main() {
c := make(chan int)
// 使用goroutine
go func() {
for i := 0; i < 10; i++ {
c <- i
}
close(c)
}()
for n := range c {
fmt.Println(n)
}
}
基本上可以把channel當作在不同Goroutine之間傳遞的變數,所以給值之後可以取值。執行後我們會得到:
0
1
2
3
4
5
6
7
8
9
內部的資料是先進先出,0
是第一個被存取進去的值,也是第一個取出來的。