学习笔记,写到哪是哪,今天就看了一个select,好好理解了一下。
select主要是用来监听chan的,使用方式和switch有点类似。
注意如果没有default语句,则会永久等待。
可以使用time.After来进行超时控制,也可以使用break进行打断。
样例代码如下面展示的内容
package main import ( "fmt" "time" ) func GoPick1(ch chan string) { time.Sleep(1 * time.Second) ch <- "Apple" } func GoPick2(ch chan string) { time.Sleep(5 * time.Second) ch <- "Banana" } func main() { ch1 := make(chan string) ch2 := make(chan string) go GoPick1(ch1) go GoPick2(ch2) _cul := 0 for true { fmt.Println(_cul) if _cul == 1 { break } select { case str1 := <-ch1: fmt.Println("get ", str1) case str2 := <-ch2: fmt.Println("get ", str2) case <-time.After(10 * time.Second): fmt.Println("time out") _cul = 1 break } } }
执行结果如下面展示内容
0
get Apple
0
get Banana
0
time out
1
可以看出,循环只走了4次,前面三次都阻塞在通道数据获取上和超时判断上。
还是很好用的,已经能想象一些使用的场景了。
比如像多队列争抢资源的场景、订阅模式等等。