golang select

golang select

先看一个例子:

func f1(ch chan int) {
    time.Sleep(time.Minute)
    ch <- 1
}

func main() {
    ch := make(chan int)
    go f1(ch)
    select {
    case x := <-ch:
        fmt.Println(x)
    case <-time.After(time.Second):  // func time.After(d time.Duration) <-chan time.Time
        fmt.Println("time out")
    }
}

select语句和switch语句类似,select语句是用来处理异步IO操作,select中case语句必须有channel的发送或接收,如上面的代码中,case1,case2都有channel的接收操作。当case中channel读写操作为非阻塞状态(即能读写)时,

  1. 将会触发相应的动作。当有多个case非阻塞时,select随机选一个执行。
  2. 如果防止select堵塞,可以写default来确保发送不被堵塞,没有case的select就会一直堵塞。
  3. 当select做选择case和default操作时,case的优先级大于default。
  4. select语句实现了一种监听模式,通常在无限循环中使用,通过在某种情况下,通过break退出循环。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • select是go语言中常用的一个关键字,其用法也一直被用作面试题来考核应聘者。今天,结合代码来分析下select...
    WallisW阅读 79,321评论 10 27
  • 1.官方解释 一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,...
    10xjzheng阅读 648评论 0 0
  • 官方定义 每个case都必须是一个通信 所有channel表达式都会被求值 所有被发送的表达式都会被求值 如果任意...
    鬼厉阅读 371评论 0 0
  • 一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,但是它的cas...
    dongzd阅读 1,073评论 0 1
  • select 介绍 从不同并发执行的协程中,获取数据可以用select来完成。select监听的多个通道,也可以用...
    Tim_SSS阅读 966评论 0 1