设为首页 加入收藏

TOP

Go 关键字Select
2019-09-03 02:42:40 】 浏览:56
Tags:关键字 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
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇GO指南练习:切片 下一篇Go语言(一) 环境的搭建

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目