GO语言教程之select 条件语句
老男孩IT教育
常见问题
2021年5月17日 15:57
select 语句是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。
select 语句是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。
每个case必须是一个通信操作,要么是发送要么是接收,select中的default子句总是可运行的。
如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。如果没有可运行的case语句,且有default语句,那么就会执行default的动作。如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行。
select 应用
1、select 语句基本使用
package main
import "fmt"
func main() {
var c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1:
fmt.Printf("received ", i1, " from c1\n")
case c2 <- i2:
fmt.Printf("sent ", i2, " to c2\n")
case i3, ok := (<-c3):
if ok {
fmt.Printf("received ", i3, " from c3\n")
} else {
fmt.Printf("c3 is closed\n")
}
default:
fmt.Printf("no communication\n")
}
}
2、超时判断
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
select {
case i := <-ch:
fmt.Printf("i = %d\n", i)
case <-time.After(time.Second * 3):
fmt.Println("time out")
}
}
3、判断channel是否阻塞
package main
import (
"fmt"
)
func main() {
// 在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断
ch := make(chan int, 5)
data := 0
select {
case ch <- data:
fmt.Println("ch <- data")
default:
fmt.Println("default")
}
}
如果你想要学习GO语言课程,可以来我校试听。Go开发课程2021全面升级(周末班), 试听即送价值69元纸质教材一本!
推荐阅读:
