• 技术文章 >后端开发 >Golang

    golang select不阻塞吗

    (*-*)浩(*-*)浩2019-12-17 11:01:43原创2565

    select是go语言中常用的一个关键字,是用来监听和channel有关的IO操作,当 IO 操作发生时,触发相应的动作。

    如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行。 (推荐学习:go

    否则:

    如果有default子句,则执行该语句。

    如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。

    基本用法

    //select基本用法
    select {
    case <- chan1:
    // 如果chan1成功读到数据,则进行该case处理语句
    case chan2 <- 1:
    // 如果成功向chan2写入数据,则进行该case处理语句
    default:
    // 如果上面都没有成功,则进入default处理流程

    如果有一个或多个IO操作可以完成,则Go运行时系统会随机的选择一个执行,否则的话,如果有default分支,则执行default分支语句,如果连default都没有,则select语句会一直阻塞,直到至少有一个IO操作可以进行

    start := time.Now()
        c := make(chan interface{})
        ch1 := make(chan int)
            ch2 := make(chan int)
    
        go func() {
    
            time.Sleep(4*time.Second)
            close(c)
        }()
    
        go func() {
    
            time.Sleep(3*time.Second)
            ch1 <- 3
        }()
    
          go func() {
    
            time.Sleep(3*time.Second)
            ch2 <- 5
        }()
    
        fmt.Println("Blocking on read...")
        select {
        case <- c:
    
            fmt.Printf("Unblocked %v later.\n", time.Since(start))
    
        case <- ch1:
    
            fmt.Printf("ch1 case...")
          case <- ch2:
    
            fmt.Printf("ch1 case...")
        default:
    
            fmt.Printf("default go...")
        }

    运行上述代码,由于当前时间还未到3s。所以,目前程序会走default。

    以上就是golang select不阻塞吗的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:golang
    上一篇:golang rune几个字节 下一篇:golang sleep为什么没有返回值
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• golang中使用rand产生随机不重复数字• golang web开发乱码的原因与解决方法• golang gin框架错误处理• golang gf怎么使用
    1/1

    PHP中文网