入坑 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)  // 有缓冲管道

管道的读写是通过操作符: 「<-」控制的,管道在左边表示把右侧数据写入到管道中, 管道在右边表示读取管道数据赋值给左侧变量。

ch1 := make(chan string)  // 初始化ch1 <- "gjl";  // 把 gjl 字符串写入到管道中c := <- ch1;  // 读取管道数据并交给 c 变量fmt.Println(c) // 输出

同时也可以通过操作符来限制管道的读写权限。

举个栗子:

func ChanRW(ch chan int) {  // 可以读写}
func ChanR(ch <-chan int){  // 仅可以读}
func ChanW(ch chan<- int){ // 仅可以写}

注意:对于值为 nil 的管道, 无论读写都会使协程永久阻塞。

最后我们具体看一下管道发送和接收时的处理流程图, 用 processon 简单画一下图(最近沉迷练习画图 - -):

发送:

接收:

如果您在实际开发过程中遇到过 Python、数据库、爬虫、分布式、消息队列等方面的难题, 也欢迎在公众号或评论区留言, 我们一起探讨解决方案

如果本篇内容能够帮助到您, 希望您关注我的公众号: 「python 学习爱好者」, 希望与您一起共同成长~

Go 语言入门 1-管道的特性及实现原理的更多相关文章

  1. Go语言入门(一)特性、安装、环境搭建、第一个程序等

    Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性.谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮 ...

  2. GO 语言入门(一)

    GO 语言入门(一) 本文写于 2020 年 1 月 18 日 Go 由 Google 工程师 Robert Griesemer,Rob Pike 和 Ken Thompson 设计的一门编程语言,第 ...

  3. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书

    <C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...

  4. c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...

  5. 【转】c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...

  6. go语言入门

    Go语言最主要的特性: 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反射 语言交互性 1.2.4 错误处理Go语言引入了3个关键字用 ...

  7. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  8. PBFT概念与Go语言入门(Tendermint基础)

    Tendermint作为当前最知名且实用的PBFT框架,网上资料并不很多,而实现Tendermint和以太坊的Go语言,由于相对小众,也存在资料匮乏和模糊错漏的问题.本文简单介绍PBFT概念和Go语言 ...

  9. 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射

    使用Code First建模自引用关系笔记   原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...

随机推荐

  1. Redis之Lua的应用(四)

    一.什么是Lua脚本 Lua是一个高效的轻量级脚本语言(和JavaScript类似),用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.Lu ...

  2. BUUCTF-签到题

    签到题 很简单写在介绍里面了.

  3. 《ECMAScript 6 入门》【一、let、const命令】(持续更新中……)

    前言: 我们在ES5都使用var来声明常量跟变量,ES6使用了最新的语法,使用let跟const分别声明.一.let命令: let命令是用于声明变量块级作用域 1. { let a = 10; var ...

  4. js 表面使用 表面学习 -输出

    JavaScript 能够以不同方式"显示"数据: 使用 window.alert() 写入警告框 使用 document.write() 写入 HTML 输出 使用 innerH ...

  5. bat-命令行安装软件

    批处理 执行的两种方式 1.直接右键以管理员身份运行 2.在管理员身份的cmd窗口中 .\xxx.bat 执行 区别 第一种方式 当前cmd默认路径为 C:\windows\system32 第二种方 ...

  6. Linux下修改RabbitMQ密码

    1,首先查看用户列表 rabbitmqctl list_users 2,修改对应用户密码 其中username 为用户名, newpasswd为新密码 rabbitmqctl change_passw ...

  7. sqlserver 把c#代码的string[] 的ids转换成一个数据table表

    declare @string varchar(200),@sql varchar(1000)set @string = '1,2,3,4,5,6'set @sql = 'select code='' ...

  8. Min_25 筛与杜教筛

    杜教筛 \(\) 是 \(\) 的前缀和,\(\), \(\) 同理. 假设 \( × = ℎ\) ,并且 \(, \) 易求出,\(\) 难求出. 那么 \[H () = \sum_{ \cdot ...

  9. Windows对拍系统

    有个东西可以帮助对拍,告诉你两个程序的输出哪不一样(但是无法得知错误位置,聊胜于无吧) 一.打开计算机  二.在上方输入$cmd$,摁下回车 三.弹出对话窗如下,输入$fc +$空格,输入两个需要比较 ...

  10. 动手实践丨手把手教你用STM32做一个智能鱼缸

    摘要:本文基于STM32单片机设计了一款基于物联网的智能鱼缸. 本文分享自华为云社区<基于STM32+华为云IOT设计的物联网鱼缸[玩转华为云]>,作者: DS小龙哥 . 1. 前言 为了 ...