golang中Channel通道(二)
golang中Channel通道(二)
一、带缓冲和不带缓冲的通道的区别
1、非缓冲通道
一次发送操作对应一次接收操作,对于一个goroutine来讲,它的一次发送,在另一个goroutine接收之前都是阻塞的。同样的,对于接收来讲,在另一个goroutine发送之前,它也是阻塞的。
2、缓冲通道
缓冲通道就是指一个通道,带有一个缓冲区。发送到一个缓冲通道只有在缓冲区满时才被阻塞。类似地,从缓冲通道接收的信息只有在缓冲区为空时才会被阻塞。
可以通过将额外的容量参数传递给make函数来创建缓冲通道,该函数指定缓冲区的大小。语法:
ch := make(chan type,capacity)
上述语法的容量应该大于0,以便通道具有缓冲区。默认情况下,无缓冲通道的容量为0,因此在之前创建通道时省略了容量参数。
实例:
package mainimport "fmt"
//带缓冲和不带缓冲的通道
func main() {ch1:=make(chan int) //非缓冲区通道fmt.Println(len(ch1),cap(ch1)) //0 0//ch1 <- 100 //阻塞式的,需要有其他的goroutine解除阻塞,否则deadlockch2:=make(chan int, 5) //缓冲区通道fmt.Println(len(ch2),cap(ch2)) //0 5ch2 <- 100fmt.Println(len(ch2),cap(ch2)) //1 5ch2 <- 200ch2 <- 300ch2 <- 400ch2 <- 500fmt.Println(len(ch2),cap(ch2)) //5 5//ch2 <- 600 //deadlock
}
二、单向通道和双向通道
1、双向通道
通道,channel,是用于实现goroutine之间的通信的。一个goroutine可以向通道中发送数据,另一条goroutine可以从该通道中获取数据。既可以发送数据,也可以读取数据,我们又把这种通道叫做双向通道。
data := <- a / / read from channel a
a <- data / / write to channel a
2、单向通道
单向通道,也就是定向通道。可以通过这些通道接收或者发送数据。我们也可以创建单向通道,这些通道只能发送或者接收数据。
实例:
package mainimport "fmt"
//单向通道
func main() {ch1 :=make(chan int)//双向,读,写//ch2 :=make(chan<- int)//单向,只能写,不能读//ch3 := make(<- chan int)//单向,只能读,不能写//ch1 <-100//data:=<-ch1//ch2 <-1000//data := <- ch2 //invalid operation: <-ch2 (receive from send-only type chan<- int)//data :=<- ch3//ch3 <- 2000 //invalid operation: ch3 <- 2000(send to receive-only type <-chan int)go fun1(ch1)//可读,可写//go fun1(ch2)//只写data :=<-ch1fmt.Println( "fun1函数中写出的数据是:",data)
}
func fun1(ch chan <- int) {ch <- 100fmt.Println("fun1函数结束。。。")
}
golang中Channel通道(二)相关推荐
- golang中channel使用
1 golang中channel使用 文章目录 1 golang中channel使用 1.1 channel介绍 1.2 channel使用 1.2.1 channel声明和初始化 1.2.2 cha ...
- golang 中 channel 的详细使用、使用注意事项及死锁分析
什么是 channel 管道 它是一个数据管道,可以往里面写数据,从里面读数据. channel 是 goroutine 之间数据通信桥梁,而且是线程安全的. channel 遵循先进先出原则. 写入 ...
- golang中channel的传递
需要注意的是,go语言中channel本省也是一个原生类型,与map之类的类型一样,因此channel本省在定义后也可以通过channel来传递 可以使用这个特性来实现pipe特性,管道也是使用非常广 ...
- golang中生成读取二维码
二维码登录原理 https://zhuanlan.zhihu.com/p/110127600 skip2/go-qrcode 生成二维码 github地址:https://github.com/ski ...
- Golang中select的实现原理
前言 select是Golang在语言层面提供的多路IO复用的机制.与switch语句稍微有点相似,也会有case和最后的default选择支.每一个case代表一个通信操作(在某个channel上进 ...
- golang中并发sync和channel
golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...
- 卷积网络中的通道(Channel)理解
卷积网络中的通道(Channel)理解 卷积网络中有一个很重要的概念,通道(Channel),也有叫特征图(feature map)的. 卷积网络中主要有两个操作,一个是卷积(Convolution) ...
- 【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )
文章目录 一.多路复用技术 二.await 协程多路复用 三.Channel 通道多路复用 一.多路复用技术 在信号传输时 , 通信信道 的 带宽 远大于 传输单一信号的需求 , 在同一信道中可以同时 ...
- golang中的二维数组和二维切片
golang中数组和切片用的比较多,下面给个demo看看二维的数组和二维切片. package mainimport ("fmt" )func printarray(a [2][2 ...
最新文章
- 京东运营插件_技术中台产品经理必知的那些易混词儿(1):组件、套件、 中间件、插件……...
- 无状态逻辑服务器,无状态 | RESTful API 中文网
- 安装mysql5.5时常见错误--缺失make
- http通信协议的基本原理
- 公司网站Silverlight版^_^
- 用Priam设置Cassandra
- ENSP配置 实例十一 综合实验
- 深度模型推理在腾讯游戏的应用与实践(王者荣耀、和平精英等均有应用)
- CTreeCtrl::HitTest
- 《刺猬的优雅》观后感
- 计算机设备财产登记册,幼儿园财产登记制度
- 大一上学期闭组考核(借阅功能有逻辑错误)
- TwinCAT 3 轴程序
- 声音文件格式、常见的数字音频格式
- 关于GPIO的内部结构及编程步骤
- 手把手教你开发红外遥控器
- 来把三子棋吗?创建属于你的三子棋。
- SAP 折旧在13-16调整期
- PIL库 : 居中对齐写入文本(英文 / 中文)
- 数据仓库(9)数仓缓慢变化维度数据的处理