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 上轉手。