管道

go语言中管道底层是一个环形队列(先进先出),写入(send)和 取出(recv)都是从同一个位置按照同一方向顺序执行。

sendx表示最后一次插入元素位置,recvx表示最后一次取出元素的位置

管道声明、写入(send)与 取出(recv)

var ch chan int
fmt.Printf("ch is %v\n", ch) // ch is <nil>
fmt.Printf("len of ch is %d\n", len(ch)) // len of ch is 0
fmt.Printf("cap of ch is %d\n", cap(ch)) // cap of ch is 0
// 往管道里面写入(send)数据
ch <-1 // fatal error: all goroutines are asleep - deadlock!

为什么会报错呢?在使用管道前一定要初始化管道,给管道一个容量,不然数据无法写入就一直阻塞出现死锁。初始化管道后,管道写满后在写入数据,就无法写入会阻塞,然后就会报错(fatal error: all goroutines are asleep - deadlock! ),同理管道中没有元素了,在从管道中取出元素,也会一直阻塞,然后就报错(fatal error: all goroutines are asleep - deadlock!

var ch chan int
fmt.Printf("ch is %v\n", ch) // ch is <nil>
fmt.Printf("len of ch is %d\n", len(ch)) // len of ch is 0
fmt.Printf("cap of ch is %d\n", cap(ch)) // cap of ch is 0
ch = make(chan int, 8)
fmt.Printf("len of ch is %d\n", len(ch)) // len of ch is 0
fmt.Printf("cap of ch is %d\n", cap(ch)) // cap of ch is 8
ch <- 1 //往管道里面写入(send)数据
fmt.Printf("写入1元素后len of ch is %d\n", len(ch)) //写入1元素后len of ch is 1
fmt.Printf("写入1元素后cap of ch is %d\n", cap(ch)) //写入1元素后cap of ch is 8
ch <- 2
fmt.Printf("写入2元素后len of ch is %d\n", len(ch)) //写入2元素后len of ch is 2
fmt.Printf("写入2元素后cap of ch is %d\n", cap(ch)) //写入2元素后cap of ch is 8
v:=<-ch //从管道里面取出(recv)数据
fmt.Println(v) // 1
fmt.Printf("取出一个元素后len of ch is %d\n", len(ch)) //取出一个元素后len of ch is 1
fmt.Printf("取出一个元素后len of ch is %d\n", cap(ch)) //取出一个元素后len of ch is 8

遍历管道

close(ch)  //使用for range遍历管道前必须先关闭管道,禁止在写入元素,不然会报错fatal error: all goroutines are asleep - deadlock!
// 遍历管道里面存在的有的元素
for ele:=range ch {
fmt.Println(ele)
}

管道channel的更多相关文章

  1. Go语言中的管道(Channel)总结

    管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用.今天尝试对Go语言的管道来做以下总结.总结的形式采用问答式的方法,让答案更有目的性. Q1.管道是什么? 管道是Go语言在语 ...

  2. Go语言的管道Channel用法

    本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- ...

  3. (四十四)golang--协程(goroutine)和管道(channel)相结合实例

    统计1-8000之间的素数. 整体框架: 说明:有五个协程,三个管道.其中一个协程用于写入数字到intChan管道中,另外四个用于取出intChan管道中的数字并判断是否是素数,然后将素数写入到pri ...

  4. 有缓存区的管道channel

    package main import ( "fmt" "time" ) func main() { //创建一个有缓存区的管道 ch := make(chan ...

  5. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  6. channel Golang

    Golang, 以17个简短代码片段,切底弄懂 channel 基础 (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的 ...

  7. ASP.NET WebAPI 14 仿写Filter管道

    WebAPI中有设计了几种管道(Channel),大概如下:HttpMessageHandler,ActionFilter管道,ExceptionFilter管道.在三种管道中HttpMessageH ...

  8. golang channel的使用以及调度原理

    golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...

  9. [Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

    关于管道 Channel Channel 用来同步并发执行的函数并提供它们某种传值交流的机制. Channel 的一些特性:通过 channel 传递的元素类型.容器(或缓冲区)和 传递的方向由“&l ...

  10. NIO之管道 (Pipe)

    Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 代码使用示例: public static v ...

随机推荐

  1. 给SqlSugar一个优化建议

    声明:本作者无恶意只是觉得这个功能很不错,平常工作当中经常用到,自己框架也做了相应的支持,本着技术共享目的. 一.对象组合设置列更新支持 建议度:高 业务场景 1.更新列表需统一设置 例如:修改人ID ...

  2. 代码随想录贪心专题-day1

    35. 分发糖果 n 个孩子站成一排.给你一个整数数组 ratings 表示每个孩子的评分. 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻两个孩子评分更高的孩子会获 ...

  3. React组件设计之性能优化篇

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:空山 前言 由于笔者最近在开发中遇到了一个重复渲染导致子组 ...

  4. 西门子PS on eMS Standalone《导入FANUC机器人TP程序》

    导入TP程序到PDPS中 右键点击左侧项目树的 "程序" --> 点击 "创建TP程序" 打开示教器 --> 点击"SELECT" ...

  5. vulnhub_me and my grilfriend

    解题步骤 主机nmap扫描,开放22和80端口 访问该ip,发现只能本地访问 查看源代码,提示需要使用x-forwarded-for的请求头,可以在burp suite中每次添加一个请求头,也可以使用 ...

  6. pandas 删除重复项

    使用如下函数: drop_duplicates 具体示例如下: import pandas as pd # 建立一个dataframe数据 df = pd.DataFrame({'k1':['one' ...

  7. CentOS7系统初始化个人配置

    以下内容为个人最小化安装后的配置步骤 更换yum源为阿里云 yum install -y epel-release lrzsz wget yum-axelget mv /etc/yum.repos.d ...

  8. 文盘Rust -- Mutex解决并发写文件乱序问题

    在实际开发过程中,我们可能会遇到并发写文件的场景,如果处理不当很可能出现文件内容乱序问题.下面我们通过一个示例程序描述这一过程并给出解决该问题的方法. use std::{ fs::{self, Fi ...

  9. AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通

    本文收集于教程合集:AIGC从入门到精通教程汇总 我是小梦,以浅显易懂的方式,与大家分享那些实实在在可行之宝藏. 历经耗时数十个小时,总算将这份Stable Diffusion的使用教程整理妥当. 从 ...

  10. Shiro配置类中的各个配置项浅谈

    背景: 上文中在落地实践时,对Shiro进行了相关的配置,并未对其含义作用进行详细学习,本章将进一步详解其作用含义. Shiro配置类中的各个配置项的作用: @Bean public Security ...