在 Effective Go 中,介紹了一種 goroutine 與 channel 搭配使用的方法。blog
package main import ( "fmt" "time" ) func main() { c := make(chan string) go func() { time.Sleep(1000) fmt.Println("Go first!") c <- "done" }() fmt.Println("Go after.") fmt.Println("No waiting.") <-c fmt.Println("Wait for the first one.") }
在這個示例中,使用 go func() {}() 至關於讓一段代碼在背景執行,咱們不用等待它結束就能夠繼續執行下面的程序,所以,該程序的運行結果是最早打印 "Go after." string
若是不使用 channel 那麼將會在最後纔打印 "Go first!"it
這裏使用了 channel, 當遇到 <-c 時,程序就會被阻塞,須要等待消息發過來才能繼續執行。class
即,在打印完 "No waiting." 以後,等待消息,打印 "Go first!", 發送消息("done"),收到消息,打印 "Wait for the first one."import
也就是說,能夠經過使用 channel 來監視 goroutine 有沒有結束。channel