欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Go 关键字Select

程序员文章站 2022-12-21 10:26:47
select select 是Go语言中常用的一个关键字,Linux再也早也引入了这个函数,用来实现非阻塞的一种方式,一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,但是它的case涉及到channel有关的I/O操作。 go select{ ca ......

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