Channel 是 goroutine 之間的通訊管道

Channel 是帶型別的管道,<- 箭頭方向就是資料流向。goroutine 之間用傳訊息取代共享記憶體,所以不必自己上鎖。

ch := make(chan string)   // 建立一條傳 string 的 channel
 
ch <- "hello"             // 送:箭頭指進 channel
message := <-ch           // 收:箭頭從 channel 指出來

完整的收送兩端:

func main() {
    ch := make(chan string)
    go send(ch)
    go receive(ch)
    time.Sleep(2 * time.Second)
}
 
func send(ch chan string)    { ch <- "hello I am Freddy" }
func receive(ch chan string) { fmt.Println(<-ch) }

型別寫成 chan string;要限制方向可寫 chan<- string(只送)與 <-chan string(只收),讓函式簽章自己說明它會拿這條 channel 做什麼。

Go 的口號 “Don’t communicate by sharing memory; share memory by communicating.” 講的就是這件事:與其讓多條 goroutine 搶同一塊記憶體再用 mutex 保護,不如讓資料的擁有權隨著訊息在 channel 上轉手。

相關:無緩衝 channel 的收送會互相等待Goroutine 是用 go 關鍵字啟動的輕量任務