详解Golang中Channel的用法
来源:脚本之家
时间:2022-12-27 18:18:00 129浏览 收藏
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《详解Golang中Channel的用法》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下channel,希望所有认真读完的童鞋们,都有实质性的提高。
如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。
1 创建channel
每个channel都有一个特殊的类型,也就是channels可发送数据的类型。一个可以发送int类型数据
的channel一般写为chan int。使用内置的make函数,如果第二个参数大于0,则表示创建一个带缓存的channel。
ch := make(chan int) // ch has type 'chan int' ch = make(chan int, 3) // buffered channel with capacity 3
2 channel的发送和接受
一个发送语句将一个值从一个goroutine通过channel发送到另一个执行接收操作的goroutine。发送和接收两个操作都使用
ch3 channel的close
Channel还支持close操作,用于关闭channel,随后对基于该channel的任何发送操作都将导致panic异常。对一个已经被close过的channel进行接收操作依然可以接受到之前已经成功发送的数据,如果channel中已经没有数据的话将产生一个零值的数据。使用内置的close函数就可以关闭一个channel:
close(ch)4 不带缓存的Channels
一个基于无缓存Channels的发送操作将导致发送者goroutine阻塞,直到另一个goroutine在相同的Channels上执行接收操作,当发送的值通过Channels成功传输之后,两个goroutine可以继续执行后面的语句。反之,如果接收操作先发生,那么接收者goroutine也将阻塞,直到有另一个goroutine在相同的Channels上执行发送操作。
基于无缓存Channels的发送和接收操作将导致两个goroutine做一次同步操作。因为这个原因,无缓存Channels有时候也被称为同步Channels。5 串联的Channels
Channels也可以用于将多个goroutine连接在一起,一个Channel的输出作为下一个Channel的输入。这种串联的Channels就是所谓的管道(pipeline)。
func main() { naturals := make(chan int) squares := make(chan int) // Counter go func() { for x := 0; x当一个被关闭的channel中已经发送的数据都被成功接收后,后续的接收操作将不再阻塞,它们会立即返回一个零值。
Go语言的range循环可直接在channels上面迭代。使用range循环依次从channel接收数据,当channel被关闭并且没有值可接收时跳出循环。6 单方向的Channels
为了防止被滥用,Go语言的类型系统提供了单方向的channel类型,分别用于只发送或只接收的channel。类型
func counter(out chan7 带缓存的Channels
带缓存的Channel内部持有一个元素队列。队列的最大容量是在调用make函数创建channel时通过第二个参数指定的。
向缓存Channel的发送操作就是向内部缓存队列的尾部插入元素,接收操作则是从队列的头部删除元素。如果内部缓存队列是满的,那么发送操作将阻塞直到因另一个goroutine执行接收操作而释放了新的队列空间。相反,如果channel是空的,接收操作将阻塞直到有另一个goroutine执行发送操作而向队列插入元素。
- write:缓冲区被填满后,写端才会阻塞。
- read:缓冲区被读空,读端才会阻塞。
可以用内置的cap函数获取channel内部缓存的容量
fmt.Println(cap(ch)) // "3"
可以用内置的len函数获取channel内部缓存队列中有效元素的个数。
fmt.Println(len(ch)) // "2"
终于介绍完啦!小伙伴们,这篇关于《详解Golang中Channel的用法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!
-
200 收藏
-
440 收藏
-
477 收藏
-
399 收藏
-
455 收藏
-
321 收藏
-
303 收藏
-
245 收藏
-
422 收藏
-
405 收藏
-
280 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 帅气的小土豆
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者分享技术贴!
- 2023-01-06 09:49:04
-
- 雪白的水蜜桃
- 太详细了,收藏了,感谢师傅的这篇文章,我会继续支持!
- 2023-01-02 08:33:07
-
- 爱撒娇的吐司
- 太全面了,mark,感谢博主的这篇技术贴,我会继续支持!
- 2022-12-30 00:25:04
-
- 粗暴的溪流
- 这篇技术贴真是及时雨啊,好细啊,很有用,码住,关注老哥了!希望老哥能多写Golang相关的文章。
- 2022-12-29 14:31:17
-
- 光亮的滑板
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢作者分享文章!
- 2022-12-29 05:05:05
-
- 畅快的猎豹
- 这篇技术贴出现的刚刚好,太详细了,太给力了,码住,关注大佬了!希望大佬能多写Golang相关的文章。
- 2022-12-28 01:45:40