golang学习之select用法

早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回。golang在语言级别直接支持select,用于处理异步IO问题。

select用法同switch类似,如下:

timeout := make (chan bool, 1)ch := make(chan int)
select {
    case <-ch:
    case <-timeout:
     fmt.Println("timeout!")
   default:
        fmt.Println("default case is running")
}

可以看出,ch初始化后,case1读取失败,timeout同样失败,因为channel中无数据,直接跳至default执行并返回。

注意,如果没有default,select 会一直等待等到某个 case 语句完成, 也就是等到成功从 ch 或者 timeout 中读到数据,否则一直阻塞。

基于这种机制,可以使用select实现channel读取超时的机制

package main

import (
    "fmt"
    "time"
)

func main() {
    timeout := make(chan bool, 1)
    go func() {
        time.Sleep(3e9) // sleep 3 seconds
        timeout <- true
    }()
    ch := make(chan int)
    select {
        case <-ch:
        case <-timeout:
            fmt.Println("timeout!")
    }
}

注意这里一定不能用default,否则3s超时还未到直接执行default,case2便不会执行,超时机制便不会实现。timeout会在3s超时后读取到数据。

使用select判断channel是否存满

ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
select {
    case <-ch1:
        fmt.Println("ch1 pop one element")
    case <-ch2:
        fmt.Println("ch2 pop one element")
    default:
        fmt.Println("default")
}

如果case1、case2均未执行,则说明ch1&ch2已满,over.....

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的小碗汤

go语言nil和interface详解

golang的nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。nil是预先说明的标识符,也即通常意义上的关键字。在gola...

635
来自专栏西安-晁州

mybatis学习之分页

分页一般分为物理分页:先查询所有值再分页输出,逻辑分页:直接分页查询输出,mybatis支持物理分页,如下: 1、物理分页: mapper映射: <select...

1830
来自专栏王亚昌的专栏

编译错误:multiple types in one declaration

/data/..../hnconv.h:6: error: multiple types in one declaration /data..../hnconv...

663
来自专栏行者常至

010.golang 结构struct

662
来自专栏Golang语言社区

go语言网络编程之tcp

go语言网络编程需要导入包 net如下 import ( "fmt" "net" ) 重要函数 func Listen(net, laddr s...

2346
来自专栏行者常至

003.golang 类型与变量

零值并不等于空值,而是当变量被声明为某种类型后的默认值, 通常情况下值类型的默认值为0,bool为false,string为空字符串

602
来自专栏Golang语言社区

go语言网络编程之tcp

go语言网络编程需要导入包 net如下 import ( "fmt" "net" ) 重要函数 func Listen(net, laddr ...

3626
来自专栏章鱼的慢慢技术路

Go语言实践_实现一(客户端)对一(服务器端)聊天室

1,首先启动服务器端,使用listen_socket函数监听IP地址上的客户端连接;

953
来自专栏Golang语言社区

Go-指针、传值与传引用、垃圾回收

要点 Go使用的*、&、new()这些运算符,和C++的用法完全一样。 有传值和传引用/传地址的概念,和C++一样。 Go没有new对应的delete操作,而是...

3195
来自专栏Golang语言社区

Golang语言-并发支持

Golang 运行时(runtime)管理了一种轻量级线程,被叫做 goroutine。创建数十万级的 goroutine 是没有问题的。范例: packag...

34614

扫码关注云+社区