当前位置: 移动技术网 > IT编程>脚本编程>Go语言 > Go 关键字Select

Go 关键字Select

2019年08月17日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网