select在Golang併發中扮演着重要的角色,若是你已經入門了select能夠跳過這篇文章,關注下一篇文章「select進階」。若是想看看,select是如何源自生活的,也能夠閱讀下這篇文章,幾分鐘就能夠讀完。golang
以前的文章都提到過,Golang的併發模型都來自生活,select也不例外。舉個例子:咱們都知道一句話,「吃飯睡覺打豆豆」,這一句話裏包含了3件事:併發
-
媽媽喊你吃飯,你去吃飯。函數
-
時間到了,要睡覺。測試
-
沒事作,打豆豆。spa
在Golang裏,select就是幹這個事的:到吃飯了去吃飯,該睡覺了就睡覺,沒事幹就打豆豆。code
結束髮散,咱們看下select的功能,以及它能作啥。協程
select功能
在多個通道上進行讀或寫操做,讓函數能夠處理多個事情,但1次只處理1個。如下特性也都必須熟記於心:事件
case
selectcasedefaultdefault
1func main() {
2 readCh := make(chan int, 1)
3 writeCh := make(chan int, 1)
4
5 y := 1
6 select {
7 case x := <-readCh:
8 fmt.Printf("Read %d\n", x)
9 case writeCh <- y:
10 fmt.Printf("Write %d\n", y)
11 default:
12 fmt.Println("Do what you want")
13 }
14}
readChwriteCh
readChcase x := <-readChwriteChcase writeCh <- ycasedefault
這個測試的結果是
1$ go run example.go
2Write 1
用打豆豆實踐select
eat()main()sleepselect
eatChsleep.Cdefault
1import (
2 "fmt"
3 "time"
4 "math/rand"
5)
6
7func eat() chan string {
8 out := make(chan string)
9 go func (){
10 rand.Seed(time.Now().UnixNano())
11 time.Sleep(time.Duration(rand.Intn(5)) * time.Second)
12 out <- "Mom call you eating"
13 close(out)
14 }()
15 return out
16}
17
18
19func main() {
20 eatCh := eat()
21 sleep := time.NewTimer(time.Second * 3)
22 select {
23 case s := <-eatCh:
24 fmt.Println(s)
25 case <- sleep.C:
26 fmt.Println("Time to sleep")
27 default:
28 fmt.Println("Beat DouDou")
29 }
30}
default
1$ go run x.go
2Beat DouDou
default
1$ go run x.go
2Mom call you eating
3$ go run x.go
4Time to sleep
5$ go run x.go
6Time to sleep
select很簡單但功能很強大,它讓golang的併發功能變的更強大。這篇文章寫的囉嗦了點,重點是爲下一篇文章作鋪墊,下一篇咱們將介紹下select的高級用法。
select的應用場景不少,讓我總結一下,放在下一篇文章中吧。