首页 > 其他分享 >golang select

golang select

时间:2023-11-22 21:34:34浏览次数:42  
标签:case default 解锁 golang select channel

golang select是多 channel 并行的利器

不要拿 switch 和 select 比,根本不是一个东西好嘛,差不少,只是名字稍微有点像

前置操作

golang 对 select 做了一些优化

select 结构体为空

当 select 里面为空的时候会直接 panic

只有一个 case

当只有一个 case 时候(包括只有一个 case 时候),会将 select 去掉

select{
case c <- x:
	return
}

转变成

c <- x
return

当有单一 case 加 default

当只有一个 case 和一个 default 时候,会转变成非阻塞的 if 操作

select{
case c <- x:
	print("ok")
default:
	print("default")
}

转变成

if (chansend()/chanrecv()){ // 非阻塞的 chansend 或 chanrecv 操作,有个 block 参数代表阻塞在通道那篇的源码有
	print("ok")
}else{
	print("default")
}

流程

当有两个以上的 case 时候,也就是普通的时候,会执行下面流程

  1. 先把所有的 channel 打乱,放入到lockorder中
  2. 然后把 lockerorder 中的 channel 都加锁
  3. 然后查看 pollorder 中是否有就绪的 channel,如果有的话就执行 send/recv 操作,将所有的其他channel 解锁
  4. 如果没有,就把当前协程加入所有对应发送/接受channel 的等待队列,然后将自己挂起(其实这个操作和一个普通goroutine 一样,都是将自己放到 channel 等待队列),然后解锁(源码没看到解锁)
  5. 等某一个 channel 可以进行写入/接受,然后加锁,找到对应的 channel ,就执行对应操作,然后解锁,或有 close 的channel也会退出

参考

由浅入深聊聊Golang中select的实现机制
golang select底层原理
深入golang -- select
图解Go中select语句的底层原理

标签:case,default,解锁,golang,select,channel
From: https://www.cnblogs.com/elve960520/p/17850350.html

相关文章

  • Golang Gin 模板基本使用
    一,模板定义,模板变量,条件判断,模板函数,模板命名1{{define"default/index.html"}}2<!DOCTYPEhtml>3<htmllang="en">45<head>6<metacharset="UTF-8">7<metaname="viewport"conte......
  • select函数的用法和原理
    Linux上的select函数select函数用于检测在一组socket中是否有事件就绪。事件分为以下三类:读就绪事件在socket内核中,接收缓冲区中的字节数大于或等于低水位标记SO_RCVLOWAT,此时调用recv或read函数可以无阻塞地读该文件描述符,并且返回值大于0。TCP连接的对端......
  • Maybatis-Plus 数据库查询 lambdaQuery和mapper中EQ、NE、GT、LT、GE、LE、select、li
    Maybatis-PluslambdaQuery和mapper中EQ、NE、GT、LT、GE、LE的用法及详解实体当前实体如下,后续代码示例都用该实体;@Data@TableName("user_info")@ApiModel(value="UserInfo对象",description="")publicclassUserInfoimplementsSerializable{privatesta......
  • 报错:Invalid bound statement (not found): com.ljxx.pts.dao.SitePriceMapper.select
    如果你是Mybatis的话请注意yml或者properties文件里面的组件扫描#指定mapper.xml的位置mybatis.mapperLocations=classpath*:mapper/**/*Mapper.xmlmybatis.configuration.map-underscore-to-camel-case=true注意:由于上面指定的是Mapper.xml,故xml文件不要携程Dao.xml......
  • Golang Gin 初识
    1.Gin框架搭建,初识1//main.go2packagemain34/***5Gin入门:6文档:https://gin-gonic.com/zh-cn/docs/quickstart/7热加载:8文档:https://github.com/cosmtrek/air/blob/master/README-zh_cn.md9安装:g......
  • mysql c++ create table,insert,select
    CREATETABLE`t1`(`id`bigintunsignedNOTNULLAUTO_INCREMENTprimarykey,`author`varchar(40)NOTNULLDEFAULT'',`comment`varchar(40)NOTNULLDEFAULT'',`content`varchar(40)NOTNULLDEFAULT'',`header`......
  • SQL DELETE 语句:删除表中记录的语法和示例,以及 SQL SELECT TOP、LIMIT、FETCH FIRST
    SQLDELETE语句SQLDELETE语句用于删除表中的现有记录。DELETE语法DELETEFROM表名WHERE条件;注意:在删除表中的记录时要小心!请注意DELETE语句中的WHERE子句。WHERE子句指定应删除哪些记录。如果省略WHERE子句,将会删除表中的所有记录!演示数据库以下是示例中使用的Cus......
  • 【golang】【注释模版】
    @目录写在前面注释要求package结构体方法代码逻辑注释参考资料基础/标准库/第三方库golang导航编程规范算法|面试项目写在前面相关博文个人博客首页免责声明:仅供学习交流使用!开源框架可能存在的风险和相关后果将完全由用户自行承担,本人不承担任何法律责任。注释要求统......
  • golang-引用传递
    dbTags:=make([]*Tag,0)for_,value:=rangeidMap{dbTags=append(dbTags,&value)}针对这种情况传递的是变量的地址会导致新的数组都是相同的值解决方式使用中间变量接一下dbTags:=make([]*Tag,0)......
  • Golang VScode 开发环境搭建
    写在前面工作遇到简单整理理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧——赫尔曼·黑塞《德米安》安装插件下载安......