select在Golang併發中扮演着重要的角色,若是你已經入門了select能夠跳過這篇文章,關注下一篇文章「select進階」。若是想看看,select是如何源自生活的,也能夠閱讀下這篇文章,幾分鐘就能夠讀完。golang

以前的文章都提到過,Golang的併發模型都來自生活,select也不例外。舉個例子:咱們都知道一句話,「吃飯睡覺打豆豆」,這一句話裏包含了3件事:併發

  1. 媽媽喊你吃飯,你去吃飯。函數

  2. 時間到了,要睡覺。測試

  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的應用場景不少,讓我總結一下,放在下一篇文章中吧。

 

併發系列文章推薦