zoukankan      html  css  js  c++  java
  • Go 关键字Select

    select

    select 是Go语言中常用的一个关键字,Linux再也早也引入了这个函数,用来实现非阻塞的一种方式,一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,但是它的case涉及到channel有关的I/O操作。

    select{
    case <-chan1:
    	// 如果成功读取到chan1中得数据,则进行该case处理语句
    case chan2 <- value:
    	// 如果成功像chan2中写入数据,则进行该case处理语句
    default:
    	// 如果上面都没有成功,则进入default处理语句
    }
    

    简单案例:

    func main(){
        ch := make(chan int)
        go func(){
            ch <- 10
        }()
        time.Sleep(time.Second)
        
        select{
        case <- ch:
            fmt.Println("come to read channel")
        default:
            fmt.Println("come to default")
        }
    }
    

    超时控制

    如果所有的case都没有成功,且没有default语句存在时,select语句会一直阻塞,知道至少有一个I/O操作进行,但如果没有,就会一直阻塞,这时我们就可以设置一个超时控制。

    实现方法一,使用协程:

    func main(){
        timeout := make(chan bool)
        ch := make(chan string)
        
        go func(ch chan bool){
            time.Sleep(time.Second * 2)
            ch <- true
        }(timeout)
        
        select {
        case value := <-ch:
            fmt.Printf("value is %v",value)
        case <= timeout: 
            fmt.Println("runing timeout...")
        }
        fmt.Println("end this demo")
    }
    

    输出结果:

    runing timeout...
    end this demo
    

    实现方法二,使用time.After()方法实现:

    func main(){
        ch := make(chan string)
        
        select {
        case value := <-ch:
            fmt.Printf("value is %v",value)
        case <= time.After(time.Second): 
            fmt.Println("runing timeout...")
        }
        fmt.Println("end this demo")
    }
    

    输出结果:

    runing timeout...
    end this demo
    

    break关键字结束select

    案例:

    func main(){
        ch1 := make(chan int,1)
        ch2 := make(chan int,1)
        
        select{
        case ch1 <- 10:
            fmt.Println("this is ch1")
            break
            fmt.Println("ch1 write value")
        case ch2 <-20:
            fmt.Println("this is ch2")
            fmt.Println("ch2 write value")
        }
    }
    

    上述代码中,ch1和ch2两个通道都可以写入值,所以系统会随机选择一个case执行,发现先择执行ch1的case时,由于又break关键字的存在,所以只会打印一句:

    this is ch1
    

    但执行ch2的case时,所有内容都会被打印:

    this is ch2
    ch2 write value
    
  • 相关阅读:
    Create Your Tab and LayerTabMenu In Katana
    Linux C Programing
    Linux C Programing
    dynamics_cast<>
    TBB 学习笔记
    冒泡排序算法
    Spring4学习笔记:Spring框架中为一个bean配置依赖注入的方式
    基数排序算法的Java实现
    堆排序算法的Java实现与分析
    贪心算法
  • 原文地址:https://www.cnblogs.com/louyefeng/p/11368537.html
Copyright © 2011-2022 走看看