使用select解决从管道取数据阻塞的问题,语法如下: 案例演示:
package main import ( "fmt" "time" ) func main() { //1.定义一个管道,可放10个int类型的数据 intChan := make(chan int, 10) for i := 0; i < 10; i++ { intChan<- i } //2.定义一个管道,可以放5个string类型的数据 stringChan := make(chan string, 5) for i := 0; i < 5; i++ { stringChan<- "hello" + fmt.Sprintf("%d",i) } //传统的方法遍历管道时,如果不关闭会阻塞而导致deadlock //在实际的开发中,我们不好确定什么时候该关闭管道!!!! //这时可以用select方式可以解决 //label: for{ select { //管道不关闭不会deadlock,会自动到下一个case匹配 case v := <-intChan: fmt.Printf("从intChan读取的数据%d\n",v) time.Sleep(time.Second) case v := <-stringChan: fmt.Printf("从stringChan读取的数据%d\n",v) time.Sleep(time.Second) default: fmt.Printf("取不到数据。。。\n") time.Sleep(time.Second) return //break label } } }
执行结果如下图所示:
使用select解决从管道取数据阻塞的问题 介绍到这里,更多Go学习请参考编程字典Go教程 和问答部分,谢谢大家对编程字典的支持。
原文链接:https://blog.csdn.net/cui_yonghua/article/details/94738108?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163523038816780265486325%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163523038816780265486325&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-28-94738108.pc_v2_rank_blog_default&utm_term=go&spm=1018.2226.3001.4450