没有合适的资源?快使用搜索试试~ 我知道了~
Go语言缓冲的通道
0 下载量 22 浏览量
2021-01-20
13:16:08
上传
评论
收藏 53KB PDF 举报
温馨提示
试读
2页
Go语言中缓冲的通道(buffered channel)是一种在被接收前能存储或者多个值的通道。这种类型的通道并不强制要求goroutine之间同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲容纳被发送的值,发送动作才会阻塞。 这导致有缓冲的通告和无缓冲的通道之间的一个很大的不同:无缓冲的通道保证进行发送和接收的goroutine会在同一时间进行数据交换;有缓冲的通道没有这种保证。在无缓冲通道的基础上,为通道增加一个有限大小的存储空间形成带缓冲通道。带缓冲通道在发送时无需等待接收方接收即可完成发送过
资源详情
资源评论
资源推荐
Go语言缓冲的通道语言缓冲的通道
Go语言中缓冲的通道(buffered channel)是一种在被接收前能存储或者多个值的通道。这种类型的通道并不强制要求
goroutine之间同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中没有要接收的值时,接收动
作才会阻塞。只有在通道没有可用缓冲容纳被发送的值,发送动作才会阻塞。
这导致有缓冲的通告和无缓冲的通道之间的一个很大的不同:无缓冲的通道保证进行发送和接收的goroutine会在同一时
间进行数据交换;有缓冲的通道没有这种保证。在无缓冲通道的基础上,为通道增加一个有限大小的存储空间形成带缓冲通
道。带缓冲通道在发送时无需等待接收方接收即可完成发送过程,并且不会发生阻塞,只有当存储空间满时才会发生阻塞。同
理,如果缓冲通道中有数据,接收时将不会发生阻塞,直到通道中没有数据可读时,通道将会再度阻塞。
无缓冲通道保证收发过程同步。无缓冲收发过程类似于快递员给你电话让你下楼取快递,整个递交快递的过程是同步发生
的,你和快递员不见不散。但这样做快递员就必须等待所有人下楼完成操作后才能完成所有投递工作。如果快递员将快递放入
快递柜中,并通知用户来取,快递员和用户就成了异步收发过程,效率可以有明显的提升。带缓冲的通道就是这样的一个“快
递柜”。
创建带缓冲通道创建带缓冲通道
如何创建带缓冲的通道呢?参加如下代码:
通道实例 :=make(chan 通道类型,缓冲大小)
通道类型:和缓冲通道用法一致,影响通道发送和接收的数据类型;
缓冲大小:决定通道最多可以保存的元素数量;
通道类型:被创建出的通道实例;
下面通过一个例子来理解带缓冲通道的用法,如下:
package main
import “fmt”
func main() {
//创建一个3个元素缓冲大小的整型通道
ch := make(chan int, 3)
//查看当前通道的大小
fmt.Println(len(ch))
//发送3个整型元素到通道
ch <- 1
ch <- 2
ch <- 3
//查看当前通道的大小
fmt.Println(len(ch))
}
代码输出如下:
0
3
代码说明如下:
第 8 行,创建一个带有 3 个元素缓冲大小的整型类型的通道。
第 11 行,查看当前通道的大小。带缓冲的通道在创建完成时,内部的元素是空的,因此使用 len() 获取到的返回值为 0。
第 14~16 行,发送 3 个整型元素到通道。因为使用了缓冲通道。即便没有 goroutine 接收,发送者也不会发生阻塞。
第 19 行,由于填充了 3 个通道,此时的通道长度变为 3。
weixin_38706824
- 粉丝: 2
- 资源: 893
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0