zoukankan      html  css  js  c++  java
  • go关键字之select

    select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。
    select中的case语句必须是一个channel操作
    
    select中的default子句总是可运行的。
    
    如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。
    如果没有可运行的case语句,且有default语句,那么就会执行default的动作。
    如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行
    
    典型用法
    1.超时判断
    
    //比如在下面的场景中,使用全局resChan来接受response,如果时间超过3S,resChan中还没有数据返回,则第二条case将执行
    var resChan = make(chan int)
    // do request
    func test() {
        select {
        case data := <-resChan:
            doData(data)
        case <-time.After(time.Second * 3):
            fmt.Println("request time out")
        }
    }
    
    func doData(data int) {
        //...
    }
    
    2.退出
    
    //主线程(协程)中如下:
    var shouldQuit=make(chan struct{})
    fun main(){
        {
            //loop
        }
        //...out of the loop
        select {
            case <-c.shouldQuit:
                cleanUp()
                return
            default:
            }
        //...
    }
    
    //再另外一个协程中,如果运行遇到非法操作或不可处理的错误,就向shouldQuit发送数据通知程序停止运行
    close(shouldQuit)
    
    3.判断channel是否阻塞
    
    //在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断
    ch := make (chan int, 5)
    //...
    data:=0
    select {
    case ch <- data:
    default:
        //做相应操作,比如丢弃data。视需求而定
    }
    --------------------- 
    
    参考:https://blog.csdn.net/zhaominpro/article/details/77570290?utm_source=debugrun&utm_medium=referral

    注:select主要进行channel状态的判断,本质是channel能否有数据读出,通过该判断进行一些有趣的应用。

  • 相关阅读:
    Vue 2.0学习(三)指令与事件
    Vue 2.0学习(二)数据绑定
    Vue 2.0学习(一)简介
    大数据入门学习(一):初识大数据
    Knockout.js(四):自定义绑定
    03 Python基础
    02 测试环境的搭建
    01 自动化测试基础
    第29章 项目10:DIY街机游戏
    第27章 项目8:使用XML-RPC进行文件共享
  • 原文地址:https://www.cnblogs.com/thingk/p/9946574.html
Copyright © 2011-2022 走看看