当前位置: 首页 > 面试题库 >

如何实施Go渠道?

李凯定
2023-03-14
问题内容

在简要回顾了Go语言规范,有效的Go和Go内存模型之后,我仍然不清楚Go通道是如何工作的。

它们是什么样的结构?它们的行为有点像线程安全队列/数组。

它们的实现取决于体系结构吗?


问题答案:

通道的源文件位于/src/pkg/runtime/chan.go中(从您的源代码根目录开始)。

hchan是通道的中央数据结构,带有发送和接收链接列表(持有指向其goroutine和data元素的指针)和一个closed标志。Lock在runtime2.go中定义了一个嵌入式结构,根据操作系统的不同,该结构可用作互斥体(futex)或信号灯。根据构建标记,锁定实现位于lock_futex.go(Linux
/ Dragonfly / Some BSD)或lock_sema.go(Windows / OSX / Plan9 / Some BSD)中。

通道操作都是在此chan.go文件中实现的,因此您可以看到makechan,send和receive操作以及select构造,close,len和cap内置函数。

要深入了解通道的内部工作原理,您必须阅读Dmitry
Vyukov亲自撰写的关于类固醇的Go通道(Go核心开发人员,goroutines,调度程序和通道等)。



 类似资料:
  • 在Perl中,使用Moo,可以围绕sub实现sub,它将围绕类中的其他方法。 如何在Raku中实现这种行为,最好使用角色?

  • 我正在尝试实现身份验证 可以请求任何微服务的API网关。 用户微服务-我存储所有用户的地方。实现在此微服务中对用户进行身份验证。按应有的方式工作,登录路由返回我用于在此微服务中对用户进行身份验证的令牌。 其他5个微服务,未经任何身份验证或授权。 问题是:使用身份验证的正确方法是什么

  • 问题内容: 几乎每个人都使用它们,但是包括我在内的许多人只是简单地认为它们只是在起作用。 我正在寻找高质量的材料。我使用的语言是:Java,C,C#,Python,C ++,所以这些是我最感兴趣的。 现在,C ++可能是一个不错的起点,因为您可以使用该语言编写任何东西。 而且,C接近组装。如何使用纯C构造而不使用汇编来模拟异常? 最后,我听说有传言称,出于速度考虑,Google员工在某些项目中不使

  • 在新gem的初始起草中,我需要保留一些方法实现为空(将在下一步中实现) 因此,我想发出“尚未实现”异常的信号 我想知道是否有特定于Ruby语言的最佳实践或标准约定来编码这种占位符/异常。 例如:类似于: Java中的操作异常 在. net框架(C#)中没有实现异常

  • 问题内容: Try-catch旨在帮助处理异常。这意味着它将以某种方式帮助我们的系统更强大:尝试从意外事件中恢复。 我们怀疑在执行和指令(发送消息)时可能会发生某些事情,因此将其包含在try中。如果发生了几乎不可预料的事情,我们可以采取一些措施:编写渔获物。我不认为我们打电话来只是记录异常。我认为catch块旨在为我们提供从错误中恢复的机会。 现在,假设我们从错误中恢复了,因为我们可以修复错误所在

  • 本文向大家介绍如何实施区块链项目?相关面试题,主要包含被问及如何实施区块链项目?时的应答技巧和注意事项,需要的朋友参考一下 回答:**请按照以下步骤实施区块链项目。 选择你的平台 初始化区块链 选择正确的共识协议 执行您的第一个智能合约 调试和扩展