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 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Remoting: Server encountered an internal error

发生这个错误的原因是Remoting的一个配置项: <customErrors> 元素   指示此应用程序域中的服务器通道是否将经筛选的或完整的异常信息返回给本...

1777
来自专栏自由而无用的灵魂的碎碎念

解决使用SecureCRT出现的Generic clipboard failure错误

我使用securecrt连接hp-ux进行操作,使用的版本是securecrt 6.6 64bit。

1554
来自专栏地方网络工作室的专栏

打造前端 Deepin Linux 工作环境——调节鼠标滚轮速度

打造前端 Deepin Linux 工作环境——调节鼠标滚轮速度 在 deepin 的系统设置里面,没有找到鼠标滚轮速度调节的选项。但是默认情况下,其滚轮的速度...

28310
来自专栏DT乱“码”

微信小程序开发指引

官方文档教程1:http://bcoder.cn/wxopen/ 官方文档教程2:http://bing.aliaii.com/wxopen/  本文档将带你一...

40310
来自专栏前端说吧

vuex - 项目结构目录及一些简单配置

1042
来自专栏无原型不设计

【Mockplus教程】复制/克隆

复制是将页面复制到内存中,克隆是直接创建一个和原页面内容一样的新页面。 1. 复制 选中需要复制的页面,鼠标右键单击,弹出的菜单中选择“复制”, 然后在...

3003
来自专栏ionic3+

ionic3使用带图标带事件的toast

这个时候,如果想扩展这些功能,一是修改源码,二是自己实现,然而这两种方法都比较麻烦,比较好的解决方案是利用现有的开源代码,搜索ionic的相关组件寥寥无几,这个...

742
来自专栏我的博客

express4.2获取参数和视图

1.获取参数 router.get('/', function(req, res) { //console.log(req.query.a); //get a...

3045
来自专栏一“技”之长

AppleWatch开发入门三——代码交互与控制器生命周期

        在前两篇博客中,讨论了关于watch开发中框架与界面布局相关,然而主要的逻辑,终究还是要通过代码来实现的,在我们创建了项目之后,就会生成Inte...

613
来自专栏草根专栏

使用VS Code开发asp.net core (上)

本文是基于Windows10的. 下载地址: https://code.visualstudio.com/ insider 版下载地址: https://cod...

3195

扫码关注云+社区