| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Go专家编程 select--case篇 -> 正文阅读 |
|
[数据结构与算法]Go专家编程 select--case篇 |
select是golang在语言层面提供的IO多路复用机制,可以检测多个channel是否ready(可读、可写),相比较操作系统层面的IO多路复用还是方便很多。 与select 配合使用的是case和default,default是一种特殊的case。 一:case的数据结构
c表示当前case语句所操作的channel指针,这也说明了一个case语句只能操作一个channel。 kind表示当前case的类型,是读还是写还是default。分别由常量定义 如下 ????????caseRecv:case语句中尝试读取c中的数据 ????????caseSend:case语句中尝试向C中写入数据 ????????caseDefault:default语句 elem表示缓冲区地址,根据kind不同有不同的作用,如果kind==Recv,elem就表示从c读取数据存放的地方。如果kind==Send,elem就表示向c写入数据 存放的地方。 二:select实现原理源码包
参数说明: cas0为scase数组的首地址,selectgo的作用就是从这些cases当中找出一个返回。 order0为一个两倍cas0数组长度的buffer,存放的是scase随机序列(pollorder)+scase中channel的地址序列(lockorder) ????????pollorder:每次调用selectgo,都会把scase顺序打乱,以达到随机检测case的目的。 ????????lockorder:去重防止对channel加锁时重复加锁的目的。 ncases:scases数组的长度 返回值说明: ? ? ? ? int表示返回的case的编号 ? ? ? ? bool表示?是否成功从channle中读取了数据,如果选中的case是从channel中读数据,则该返回值表示是否读取成功。
注意事项: 对于读channel的case而言,case elem, ok := <-chan1:,一定要判断是否读取成功。因为如果这个channel在其他地方被close()时,当前这个读也是会返回的,只是读取失败ok为false!!! 总结:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 13:56:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |