Go中的channel怎么声明和使用


这篇文章主要介绍了Go中的channel怎么声明和使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go中的channel怎么声明和使用文章都会有所收获,下面我们一起来看看吧。Go语言中的通道(channel)是一种特殊的类型。在任何时候,同时只能有一个 goroutine 访问通道进行发送和获取数据。goroutine 间通过通道就可以通信。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。(1)channel本身是一个队列,先进先出(2)线程安全,不需要加锁(3)本身是有类型的,string, int 等,如果要存多种类型,则定义成 interface类型(4)channel是引用类型,必须make之后才能使用,一旦 make,它的容量就确定了,不会动态增加!!它和map,slice不一样特点:(1)一旦初始化容量,就不会改变了。(2)当写满时,不可以写,取空时,不可以取。(3)发送将持续阻塞直到数据被接收把数据往通道中发送时,如果接收方一直都没有接收,那么发送操作将持续阻塞。Go 程序运行时能智能地发现一些永远无法发送成功的语句并做出提示(4)接收将持续阻塞直到发送方发送数据。如果接收方接收时,通道中没有发送方发送数据,接收方也会发生阻塞,直到发送方发送数据为止。(5)每次接收一个元素。通道一次只能接收一个数据元素。这句代码显示:channel其实和指针一样,本身存放在一个内存单元中,有它的地址,而它的值是一个 int类型的地址。定义 interface类型的空接口,可以接收任意类型的数据,但是在取出来的时候,必须断言!
a := newCat.(Cat)关闭之后,不能再写入,只能读。只能由发送者执行这句代码通道的数据接收一共有以下 4 种写法。1.阻塞接收数据阻免费云主机域名塞模式接收数据时,将接收变量作为
执行该语句时将会阻塞,直到接收到数据并赋值给 data 变量。2.非阻塞接收数据(有问题啊,还是会报错deadlock)使用非阻塞方式从通道接收数据时,语句不会发生阻塞,格式如下:data:表示接收到的数据。未接收到数据时,data 为通道类型的零值。
ok:表示是否接收到数据。非阻塞的通道接收方法可能造成高的 CPU 占用,因此使用非常少。如果需要实现接收超时检测,可以配合 select 和计时器 channel进行,可以参见后面的内容。3.接收任意数据,忽略接收的数据阻塞接收数据后,忽略从通道返回的数据,格式如下:执行该语句时将会发生阻塞,直到接收到数据,但接收到的数据会被忽略。这个方式实际上只是通过通道在 goroutine 间阻塞收发实现并发同步。使用通道做并发同步的写法,可以参考下面的例子:4.循环接收通道的数据接收可以借用 for range 语句进行多个元素的接收操作,格式如下:通道 ch 是可以进行遍历的,遍历的结果就是接收到的数据。数据类型就是通道的数据类型。通过 for 遍历获得的变量只有一个,即上面例子中的 data。在遍历管道之前要先关闭管道,不然会出现deadlock的错误应用1开两个管道;当写协程完成工作之后,close数据管道,读协程对数据管道 intChan的数据读完之后,就向退出管道 exitChan 写入一个 true,close掉;主线程循环检测退出管道里是否有数据,如果有,说明读协程完成,主程序就可以退出了。应用2定义三个管道:intChan :放8000个数primeChan:放素数exitChan :4个协程运行完毕的标志有一个primeNum 协程因为取不到数据,退出
有一个primeNum 协程因为取不到数据,退出
有一个primeNum 协程因为取不到数据,退出
有一个primeNum 协程因为取不到数据,退出
使用协程耗时= 3
main线程退出存数字和计算素数比较简单,不提开启4个协程,运算素数,效率比单个线程高几倍!这里定义了一个匿名协程,作用是检测4个协程 有没有完成运行,取不出来就会阻塞,等待协程完成。也可以这样:
if len(exitChan) == 4关于“Go中的channel怎么声明和使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Go中的channel怎么声明和使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: vue-cli3启动服务怎么自动打开浏览器配置

这篇文章主要介绍“vue-cli3启动服务怎么自动打开浏览器配置”,在日常操作中,相信很多人在vue-cli3启动服务怎么自动打开浏览器配置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue-cli3启动服务怎么自动打开浏览器…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/15 11:56
Next 05/15 11:56

相关推荐