基于select实现的管道的超时判断
select {
case v := <-in:
fmt.Println(v)
case <-time.After(time.Second):
return // 超时
}
通过select的default分支实现非阻塞的管道发送或接收操作
select {
case v := <-in:
fmt.Println(v)
default:
// 没有数据
}
通过select来阻止main函数退出
func main() {
// do some thins
select{}
}
当有多个管道均可操作时,select会随机选择一个管道。基于该特性我们可以用select实现一个生成随机数列的程序
func main() {
ch := make(chan int)
go func() {
for {
select {
case ch <- 0:
case ch <- 1:
}
}
}()
for v := range ch {
fmt.Println(v)
}
}
我们通过select和default分支可以很容易实现一个Goroutine的退出控制
func worker(cannel chan bool) {
for {
select {
default:
fmt.Println("hello")
// 正常工作
case <-cannel:
// 退出
}
}
}
func main() {
cannel := make(chan bool)
go worker(cannel)
time.Sleep(time.Second)
cannel <- true
}