环球滚动:Go语言select语句用法示例
(资料图片仅供参考)
目录
用法使用场景实现收发功能注意事项用法
多个通道 Channel 中信息的发送和接受处理的专用的语句—select 语句。select 语句会阻塞,直到其中的一个发送/接收操作准备好。select 语句和 switch 语句有点相似,但 select 语句在被执行时会选择执行其中的一个分支,且选择分支的方法完全是不相同的。
ch1 = make(chan string)
ch2 = make(chan string)
ch1 <- "server1"
ch2 <- "server1"
select {
case i := <- ch1:
fmt.Printf("从ch1读取了数据%d", i)
case j := <- ch2:
fmt.Printf("从ch2读取了数据%d", i)
default:
fmt.Printf("no action...", i)
}
以上代码中,每个 case 后都只针对某个通道的接收语句,这个和 switch 不同,也没有 break。switch 语句右边是一个switch 表达式,但 select 右边是接大括号。
开始执行 select 语句时,所有跟在 case 关键字右边的表达式都会被求值,求值的顺序是自上而下,从左到右的。
使用场景
实现收发功能
select 是控制 channel 必不可少的部分,channel 的主要功能就是收发信息,基于此可以设计一个生产者消费者功能。生产者发送消息,消费者接受消息
func main(){
// 生产数据,将数据写入 channel
n1 := make(chan int)
go func() {
i := 0
for {
time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
n1 <- i
i++
}
}()
n2 := make(chan int)
go func() {
i := 0
for {
time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
n2 <- i
i++
}
}()
// 从 channel 中读取到数据就输出
for {
select {
case n := <-n1:
fmt.Printf("从ch1读取了数据%d", n)
case n := <-n2:
fmt.Printf("从ch1读取了数据%d", n)
}
}
}
注意事项
select 只能用于 chan 的 IO 操作select 的 case 都是并行的,case 读取到数据就执行,但是如果没有读取到且未设置 default 将导致阻塞尽量设置 default 避免没有 IO 操作发生时,select 语句一直阻塞,直到某个 case 分支命中如果是空的 select 有可能会引起死锁,所以在 select 执行过程中,必须命中某一 case 分支select {}
防止阻塞还有一个方法:设置超时
以上就是Go语言select语句用法示例的详细内容,更多关于Go select语句的资料请关注脚本之家其它相关文章!
X 关闭
X 关闭
- 1AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 2转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 3充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 4好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 5名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 6亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 7京东绿色建材线上平台上线 新增用户70%来自下沉市场
- 8网红淘品牌“七格格”chuu在北京又开一家店 潮人新宠chuu能红多久
- 9市场竞争加剧,有车企因经营不善出现破产、退网、退市
- 10北京市市场监管局为企业纾困减负保护经济韧性

