使用select解决从管道取数据阻塞的问题 (Golang经典编程案例)


使用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解决从管道取数据阻塞的问题 (Golang经典编程案例)介绍到这里,更多Go学习请参考编程字典Go教程 和问答部分,谢谢大家对编程字典的支持。


原文链接:https://blog.csdn.net/cui_yonghua/article/details/94738108?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163480011616780274138504%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163480011616780274138504&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-94738108.pc_v2_rank_blog_default&utm_term=go&spm=1018.2226.3001.4450