select 可以很好的配合 goroutline 和 channel
select 語句使得一個 goroutine 在多個通訊操作上等待。
select 會阻塞,直到條件分支中的某個可以繼續執行,這時就會執行那個條件分支。當多個都準備好的時候,會隨機選擇一個。
當 select 中的其他條件分支都沒有準備好的時候,default 分支會被執行, 此時不會阻塞
下面例子中,因為select的阻塞, 即便沒有添加time.Sleep(), 主線程也沒有退出
package main
import "log"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
log.Println("quit")
return
}
// 如果為了非阻塞的發送或者接收,可使用 default 分支
// default:
// log.Println("默認執行")
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
// 取出10次c管道中的內容
log.Println(<-c)
}
// 當執行了 quit的取操作時, select語句切換到 case <- quit語句
quit <- 0
}()
fibonacci(c, quit)
}
至此, 官方的入門文檔的內容已闡述完
參考資料:
http://go-tour-zh.appspot.com/