管道channel
管道
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的更多相关文章
- Go语言中的管道(Channel)总结
管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用.今天尝试对Go语言的管道来做以下总结.总结的形式采用问答式的方法,让答案更有目的性. Q1.管道是什么? 管道是Go语言在语 ...
- Go语言的管道Channel用法
本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- ...
- (四十四)golang--协程(goroutine)和管道(channel)相结合实例
统计1-8000之间的素数. 整体框架: 说明:有五个协程,三个管道.其中一个协程用于写入数字到intChan管道中,另外四个用于取出intChan管道中的数字并判断是否是素数,然后将素数写入到pri ...
- 有缓存区的管道channel
package main import ( "fmt" "time" ) func main() { //创建一个有缓存区的管道 ch := make(chan ...
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- channel Golang
Golang, 以17个简短代码片段,切底弄懂 channel 基础 (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的 ...
- ASP.NET WebAPI 14 仿写Filter管道
WebAPI中有设计了几种管道(Channel),大概如下:HttpMessageHandler,ActionFilter管道,ExceptionFilter管道.在三种管道中HttpMessageH ...
- golang channel的使用以及调度原理
golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...
- [Go] 通过 17 个简短代码片段,切底弄懂 channel 基础
关于管道 Channel Channel 用来同步并发执行的函数并提供它们某种传值交流的机制. Channel 的一些特性:通过 channel 传递的元素类型.容器(或缓冲区)和 传递的方向由“&l ...
- NIO之管道 (Pipe)
Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 代码使用示例: public static v ...
随机推荐
- Day07_Java_作业
A:简答题 1. 构造方法的作用是什么?构造方法的特点是什么?构造方法的注意事项? 构造方法中可不可以写return语句呢? 2. 一个类的缺省构造方法可以有参数吗? 3. 静态代码块和构造代码块的特 ...
- 【技术积累】JavaScript中的基础语法【一】
Math对象 JavaScript中的Math对象是一个内置的数学对象,表示对数字进行数学运算的方法和属性的集合. Math对象不是一个构造函数,所以不能使用new关键字来创建一个Math对象的实例. ...
- C# 12新预览功能介绍
Visual Studio 17.7 Preview 3和.NET 8 Preview 6延续了C# 12的发展.该预览版包含的功能旨在为未来的性能增强奠定基础.对内联数组的轻松访问将允许库在更多地方 ...
- ChatGPT的探索与实践-业务应用篇
本篇文章主要介绍在实际的开发过程当中,如何使用GPT帮助开发,优化流程,恰逢今年京东20周年庆,文末会介绍如何与618大促实际的业务相结合,来提升应用价值.全是干货,且本文所有代码和脚本都是利用GPT ...
- java读取txt文件解决乱码问题
说明:由于txt文件有bom和不同的编码方式,导致导入数据时产生乱码,以下代码完美解决乱码问题. 参考他人代码,结合自己的业务加工完成,费了大半天功夫完成,希望对大家有点用处. 废话不多说,直接上代码 ...
- 从read 系统调用到 C10M 问题
一.前言 从上个世纪到现在,工程师们在优化服务器性能的过程中,提出了各种不同的io模型,比如非阻塞io,io复用,信号驱动式io,异步io.具体io模型在不同平台上的实现也不一样,比如io复用在bsd ...
- linux测试ipv6
前言 操作系统版本:centos 7.6 curl版本:7.87(centos 7自带的curl版本是7.29,测ipv6会有问题) 系统开启ipv6 centos 7默认开启 ipv6,可检查net ...
- 《深入理解Java虚拟机》读书笔记:垃圾收集器
垃圾收集器 HotSpot虚拟机包含的所有收集器如图3-5所示.图3-5展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用. 新生代收集器:Serial.ParNew ...
- 遗传算法解决航路规划问题(MATLAB)
遗传算法 文章部分图片和思路来自司守奎,孙兆亮<数学建模算法与应用>第二版 定义:遗传算法是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,模拟自然界中的声明进化机制,在人工系统中实 ...
- 解决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 ...