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通道(二)相关推荐

  1. golang中channel使用

    1 golang中channel使用 文章目录 1 golang中channel使用 1.1 channel介绍 1.2 channel使用 1.2.1 channel声明和初始化 1.2.2 cha ...

  2. golang 中 channel 的详细使用、使用注意事项及死锁分析

    什么是 channel 管道 它是一个数据管道,可以往里面写数据,从里面读数据. channel 是 goroutine 之间数据通信桥梁,而且是线程安全的. channel 遵循先进先出原则. 写入 ...

  3. golang中channel的传递

    需要注意的是,go语言中channel本省也是一个原生类型,与map之类的类型一样,因此channel本省在定义后也可以通过channel来传递 可以使用这个特性来实现pipe特性,管道也是使用非常广 ...

  4. golang中生成读取二维码

    二维码登录原理 https://zhuanlan.zhihu.com/p/110127600 skip2/go-qrcode 生成二维码 github地址:https://github.com/ski ...

  5. Golang中select的实现原理

    前言 select是Golang在语言层面提供的多路IO复用的机制.与switch语句稍微有点相似,也会有case和最后的default选择支.每一个case代表一个通信操作(在某个channel上进 ...

  6. golang中并发sync和channel

    golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...

  7. 卷积网络中的通道(Channel)理解

    卷积网络中的通道(Channel)理解 卷积网络中有一个很重要的概念,通道(Channel),也有叫特征图(feature map)的. 卷积网络中主要有两个操作,一个是卷积(Convolution) ...

  8. 【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )

    文章目录 一.多路复用技术 二.await 协程多路复用 三.Channel 通道多路复用 一.多路复用技术 在信号传输时 , 通信信道 的 带宽 远大于 传输单一信号的需求 , 在同一信道中可以同时 ...

  9. golang中的二维数组和二维切片

    golang中数组和切片用的比较多,下面给个demo看看二维的数组和二维切片. package mainimport ("fmt" )func printarray(a [2][2 ...

最新文章

  1. 京东运营插件_技术中台产品经理必知的那些易混词儿(1):组件、套件、 中间件、插件……...
  2. 无状态逻辑服务器,无状态 | RESTful API 中文网
  3. 安装mysql5.5时常见错误--缺失make
  4. http通信协议的基本原理
  5. 公司网站Silverlight版^_^
  6. 用Priam设置Cassandra
  7. ENSP配置 实例十一 综合实验
  8. 深度模型推理在腾讯游戏的应用与实践(王者荣耀、和平精英等均有应用)
  9. CTreeCtrl::HitTest
  10. 《刺猬的优雅》观后感
  11. 计算机设备财产登记册,幼儿园财产登记制度
  12. 大一上学期闭组考核(借阅功能有逻辑错误)
  13. TwinCAT 3 轴程序
  14. 声音文件格式、常见的数字音频格式
  15. 关于GPIO的内部结构及编程步骤
  16. 手把手教你开发红外遥控器
  17. 来把三子棋吗?创建属于你的三子棋。
  18. SAP 折旧在13-16调整期
  19. PIL库 : 居中对齐写入文本(英文 / 中文)
  20. 数据仓库(9)数仓缓慢变化维度数据的处理

热门文章

  1. Java API文档
  2. python 对文件夹内的文件顺序编号
  3. echarts饼状图数据过多时,数据叠加(问题篇)
  4. 代写编程的作业、笔试题、课程设计,包括但不限于C/C++/Python
  5. hyperv服务器有几台虚拟机,一台Hyper-V服务器上有多少台虚拟机?
  6. 人体红外测温仪方案产品参数介绍
  7. 大数据5v指的是什么?——以沃尔玛为例
  8. Shopify独立站引流方法汇总
  9. 利用libwebsockets写ws、wss服务端和客户端
  10. 实操:安装深度DeepinLinux桌面操作系统(替代微软Windows的国产开源系统)