首页 > 其他分享 >Golang基础-- select的用法

Golang基础-- select的用法

时间:2023-04-09 22:47:42浏览次数:32  
标签:语句 case -- chan1 Golang select 执行 channel

select是golang在语言层面提供的多路IO复用的机制,其可以检测多个channel是否ready

三个题目示例来说明一下select的大概作用:

题目一:

声明两个channel,分别为chan1和chan2,依次启动两个协程,分别向两个channel中写入一个数据就进入 睡眠。select语句两个case分别检测chan1和chan2是否可读,如果都不可读则执行default语句。

import (
    "fmt"
    "time"
)

func main() {
    chan1 := make(chan int)
    chan2 := make(chan int)

    go func() {

        chan1 <- 1
        time.Sleep(time.Second * 10)
    }()

    go func() {

        chan2 <- 2
        //time.Sleep(time.Second)
    }()

    select {
    case <-chan1:
        fmt.Println("channel1 ready")

    case <-chan2:
        fmt.Println("channel2 ready")
    default:
        fmt.Println("default")
    }

    fmt.Println("main exit")
}

select中各个case执行顺序是随机的,如果某个case中的channel已经ready,则执行相应的语句并退 出select流程,如果所有case中的channel都未ready,则执行default中的语句然后退出select流程。另外, 由于启动的协程和select语句并不能保证执行顺序,所以也有可能select执行时协程还未向channel中写入数据, 所以select直接执行default语句并退出。

 

 

 

 

 

标签:语句,case,--,chan1,Golang,select,执行,channel
From: https://www.cnblogs.com/99kol/p/17301328.html

相关文章

  • SpringMVC中使用引入jquery不能加载页面
    今天在学习springMVC的json数据绑定时,需要使用到jquery发送ajax请求。但是当我通过是<script>标签引入了jquery.js。但是当我访问该jsp的时候就是不显示页面的内容我一直以为时SpringMVC的servelt拦截器拦截了静态资源,但是我过滤了静态资源还是不显示。后来才发现,我把<script......
  • 【Java 并发】【十】【JUC数据结构】【七】ConcurrentHashMap前置篇HashMap原理
    1 前言前几节我们分析了一些并发安全的数据结构,分别是CopyOnWrite系列的CopyOnWriteArrayList、BlockingQueue阻塞队列系列的LinkedBlockingQueue、ArrayBlockingQueue、DelayQueue。接下来我们要讲解一个很重要的并发安全的数据结构,ConcurrentHashMap。在Java的数据结构里面平......
  • Rust编程语言入门之cargo、crates.io
    cargo、crates.io本章内容通过releaseprofile来自定义构建在https://crates.io/上发布库通过workspaces组织大工程从https://crates.io/来安装库使用自定义命令扩展cargo一、通过releaseprofile来自定义构建releaseprofile(发布配置)releaseprofile:是预......
  • 国家医保服务平台js逆向(SM4+SM2)
    网站:aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL25hdGlvbmFsSGFsbFN0LyMvc2VhcmNoL21lZGljYWwtc2VydmljZT9jb2RlPTkwMDAwJmZsYWc9ZmFsc2UmZ2JGbGFnPXRydWU=接口分析通过接口分析可以看到加密参数分别在headers和data都进行了加密。寻找加密点1、headers参数参数搜索,将加密key进行......
  • 强连通分量,tarjan
    强连通:有向图两个点互相可以到达,则称为强连通,强连通分量指将图分成多个子图,每个子图的点都能相互到达,子图就称为强连通分量;constintN=1e5+5;vector<int>e[N];intdfn[N]//dfs顺序,low[N]//往前跳能到达的最小数,dex,bel[N]//表示每一个点在哪一个强连通分量中,cn......
  • 程序员面试金典---2
    回文排列思路:回文排列的特征之一就是如果字符串中每个字符的个数都是两个,或者只有只有一个字符个数为奇数个。只有上述两种结果。classSolution:defcanPermutePalindrome(self,s:str)->bool://将字符串转成个数字典s_dic=Counter(s)/......
  • flask----day05( )
    ......昨日回顾#1导出项目依赖pipreqs#2函数和方法的区别#3local对象 -并发编程中的一个对象,它可以保证多线程并发访问数据安全-本质原理是:不同的线程,操作的是自己的数据-不支持协程#4自己定义local,支持线程和协程 #注意点一:try:......
  • Linux touch命令
    Linuxtouch命令常用命令Linuxtouch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。ls-l可以显示档案的时间记录。语法touch[-acfm][-d<日期时间>][-r<参考文件或目录>][-t<日期时间>][--help][--version][文件或目录......
  • vue-day2
    绑定class样式:class=""(v-bind的缩写)修改vue维护的数据,而非直接操作dom绑定style,内联样式,交给vue管理(要对象,或者数组)font-size -> fontSize  换位驼峰  ⭐⭐⭐vue条件渲染v-show底层->调整style行内样式,display:nonev-ifdom节点都没了,彻底......
  • 4月9日list的实现
    首先list不同于string和vector他是链式结构,所以需要对他的每个节点自定义.并且每个节点要包含上或下节点的指针.因为struct在c++中升级成了类所以她也需要几大默认函数,但同时他也适用结构体.于是图片中对节点进行了声明和完成了构造函数.完成了list节点的构造就要开始list类的......