欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > go的select多路复用

go的select多路复用

2025/11/12 16:09:37 来源:https://blog.csdn.net/zhanghao143lina/article/details/148341025  浏览:    关键词:go的select多路复用
传统的方法在遍历管道时,如果不关闭会阻塞而导致 deadlock ,在实际开发中,可能我们不好确定什么关闭该管道。使用select来获取channel里面的数据的时候不需要关闭channel
你也许会写出如下代码使用遍历的方式来实现:
for {
// 尝试从 ch1 接收值
data, ok := <-ch1
// 尝试从 ch2 接收值
data, ok := <-ch2
}
这种方式虽然可以实现从多个管道接收值的需求,但是运行性能会差很多。为了应对这种场
景, Go 内置了 select 关键字,可以同时响应多个管道的操作。
select 的使用类似于 switch 语句,它有一系列 case 分支和一个默认的分支。每个 case 会对
应一个管道的通信(接收或发送)过程。 select 会一直等待,直到某个 case 的通信操作完成
时,

 就会执行 case 分支对应的语句

package mainimport ("fmt""time"
)func main() {// 在某些场景下我们需要同时从多个通道接收数据,这个时候就可以用到golang中给我们提供的select多路复用//1.定义一个管道 10个数据intintChan := make(chan int, 10)for i := 0; i < 10; i++ {intChan <- i}//2.定义一个管道 5个数据stringstringChan := make(chan string, 5)for i := 0; i < 5; i++ {stringChan <- "hello" + fmt.Sprintf("%d", i)}//使用select来获取channel里面的数据的时候不需要关闭channelfor {select {case v := <-intChan:fmt.Printf("从 intChan 读取的数据%d\n", v)time.Sleep(time.Millisecond * 50)case v := <-stringChan:fmt.Printf("从 stringChan 读取的数据%v\n", v)time.Sleep(time.Millisecond * 50)default:fmt.Printf("数据获取完毕")return //注意退出...}}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词