這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1、代碼
2、運行
3、解析
1、代碼
1 package main 2 3 import ( 4 "time" 5 "fmt" 6 ) 7 8 func waitFor(ch chan int) { 9 fmt.Println(time.Now(), "writing ...")10 time.Sleep(1e9)11 ch <- 1012 fmt.Println(time.Now(), "wrote ...")13 }14 15 func main() {16 var a chan int = make(chan int)17 var b chan int = make(chan int)18 var ch chan int = make(chan int)19 20 go waitFor(ch)21 22 var r int = 023 fmt.Println(time.Now(), "select ...")24 select {25 case x := <-a :26 fmt.Println(time.Now(), "read from a...")27 r = x28 case x := <-b :29 fmt.Println(time.Now(), "read from b...")30 r = x31 case x := <-ch :32 fmt.Println(time.Now(), "read from ch...")33 r = x34 }35 fmt.Println(time.Now(), "select over.., r = ", r)36 time.Sleep(1e9)37 fmt.Println(time.Now(), "over..")38 }
2、運行
1 $ go run timeout.go 2 2015-07-19 00:35:23.859684465 +0800 CST select ...3 2015-07-19 00:35:23.861022451 +0800 CST writing ...4 2015-07-19 00:35:24.864462549 +0800 CST wrote ...5 2015-07-19 00:35:24.865185396 +0800 CST read from ch...6 2015-07-19 00:35:24.874655353 +0800 CST select over.., r = 107 2015-07-19 00:35:25.888486739 +0800 CST over..
3、解析
1)主線程中的select開始運行,對select中的3個channel進行阻塞等待
2)線上程(協程)waitFor中向ch寫入資料
3)select收到資料,進行讀取
4)主線程退出