管道

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. Day07_Java_作业

    A:简答题 1. 构造方法的作用是什么?构造方法的特点是什么?构造方法的注意事项? 构造方法中可不可以写return语句呢? 2. 一个类的缺省构造方法可以有参数吗? 3. 静态代码块和构造代码块的特 ...

  2. 【技术积累】JavaScript中的基础语法【一】

    Math对象 JavaScript中的Math对象是一个内置的数学对象,表示对数字进行数学运算的方法和属性的集合. Math对象不是一个构造函数,所以不能使用new关键字来创建一个Math对象的实例. ...

  3. C# 12新预览功能介绍

    Visual Studio 17.7 Preview 3和.NET 8 Preview 6延续了C# 12的发展.该预览版包含的功能旨在为未来的性能增强奠定基础.对内联数组的轻松访问将允许库在更多地方 ...

  4. ChatGPT的探索与实践-业务应用篇

    本篇文章主要介绍在实际的开发过程当中,如何使用GPT帮助开发,优化流程,恰逢今年京东20周年庆,文末会介绍如何与618大促实际的业务相结合,来提升应用价值.全是干货,且本文所有代码和脚本都是利用GPT ...

  5. java读取txt文件解决乱码问题

    说明:由于txt文件有bom和不同的编码方式,导致导入数据时产生乱码,以下代码完美解决乱码问题. 参考他人代码,结合自己的业务加工完成,费了大半天功夫完成,希望对大家有点用处. 废话不多说,直接上代码 ...

  6. 从read 系统调用到 C10M 问题

    一.前言 从上个世纪到现在,工程师们在优化服务器性能的过程中,提出了各种不同的io模型,比如非阻塞io,io复用,信号驱动式io,异步io.具体io模型在不同平台上的实现也不一样,比如io复用在bsd ...

  7. linux测试ipv6

    前言 操作系统版本:centos 7.6 curl版本:7.87(centos 7自带的curl版本是7.29,测ipv6会有问题) 系统开启ipv6 centos 7默认开启 ipv6,可检查net ...

  8. 《深入理解Java虚拟机》读书笔记:垃圾收集器

    垃圾收集器 HotSpot虚拟机包含的所有收集器如图3-5所示.图3-5展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用. 新生代收集器:Serial.ParNew ...

  9. 遗传算法解决航路规划问题(MATLAB)

    遗传算法 文章部分图片和思路来自司守奎,孙兆亮<数学建模算法与应用>第二版 定义:遗传算法是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,模拟自然界中的声明进化机制,在人工系统中实 ...

  10. 解决Eclipse中启动Tomcat报unable to start within 45 seconds问题

    启动项目的时候报Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server ...