论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
Go 语言入门 1-管道的特性及实现原理
Go 语言入门 1-管道的特性及实现原理
曂沅仴駦
论坛元老
|
2022-9-16 17:25:54
|
显示全部楼层
|
阅读模式
楼主
主题
1705
|
帖子
1705
|
积分
5115
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
入坑 go 也快一年了,从今天开始会定期分享一下 Go 语言学习过程中的一些基础知识。
go 语言中的管道, 主要是用于协程之间的通信, 比 UNIX 的管道更加轻量和易用。
我们先看一下管道的
数据结构:
type hchan struct { gcount uint // 环形队列剩余元素个数 dataqsiz uint // 环形队列长度 buf unsafe.Pointer // 环形队列指针 elemsize uint16 // 每个元素大小 closed uint32 // 标识关闭状态 elemtype *_type // 元素类型 sendx uint // 下一个元素写入时的下标 recvx uint // 下一个元素读取时的下标 recvq waitq // 等待读消息的队列 sendq waitq // 等待写消息的队列 lock mutex // 互斥锁, 保障管道无法并发读写}
复制代码
源码链接:
https://github.com/golang/go/blob/0d0193409492b96881be6407ad50123e3557fdfb/src/runtime/chan.go#L33
通过上述数据结构, 我们可以理解管道是由三部分组成的:
环形队列
读写等待队列
队列元素基本信息
从管道读取数据时, 如果管道
缓冲区为空
或者
没有缓冲区
, 那么当前协程就会阻塞, 然后
放入 recvq 队列
中。
往管道写入数据时, 如果管道
缓冲区为空
或者
缓冲区满了
, 那么当前协程就会阻塞, 然后
放入 sendq 队列
中。
读阻塞的协程会被新来的写数据的协程唤醒。
写阻塞的协程会被新来的读数据的协程唤醒。
同时上述数据结构中, 我们可以看到一个管道中只能传递一种元素类型。 如果想数据类型动态化, 可以传递 interface。
管道的操作:
初始化
有两种方式:
变量声明:
var ch chan int // 声明一个新的管道
复制代码
使用 make:
ch1 := make(chan string) // 无缓冲管道ch1 := make(chan string 3) // 有缓冲管道
复制代码
管道的读写是通过操作符: 「
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
曂沅仴駦
论坛元老
这个人很懒什么都没写!
楼主热帖
ICA:1靶场
教你如何解决T+0的问题
国内IT硬件如何铸就新辉煌? ...
架构设计基础设施保障IaaS之计算篇 ...
快速入门python看过的一些资料 ...
JS中的Set与Map
gitee使用教程,创建项目仓库并上传代 ...
Excel文件校验
超融合技术在银行业的应用及实施中的关 ...
开源一款监控数据采集器,啥都能监控 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
Oracle
物联网
SQL-Server
快速回复
返回顶部
返回列表