为了账号安全,请及时绑定邮箱和手机立即绑定

有没有在Go中设计信号或事件API的首选方法?

有没有在Go中设计信号或事件API的首选方法?

Go
一只斗牛犬 2021-05-04 17:57:57
我正在设计一个程序包,在该程序包中,我想基于观察者模式提供API:也就是说,有些地方我想发出会触发零个或多个感兴趣方的信号。那些有兴趣的各方不必一定要彼此了解。我知道我可以从头开始实现这样的API(例如,使用通道或回调函数的集合),但是我想知道是否存在构造此类API的首选方法。在我使用过的许多语言或框架中,已经存在构建这些API的标准方法,以使它们按用户期望的方式运行:例如,g_signal_*基于glib的应用程序,事件和addEventListener()JavaScript DOM应用程序的功能,或用于。网。Go有类似的东西吗?如果不是,是否还有其他方法可以构造这种在Go中更惯用的API?
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

我要说的是,从某个通道接收的goroutine在某种程度上类似于观察者。因此,在Go中公开事件的惯用方式是恕我直言,以从包(函数)返回通道。另一个观察结果是,在Go程序中回调的使用不是太频繁。原因之一也是强大者的存在select statement

最后一点:有些人(我也是)将GoF模式视为Go反模式。


查看完整回答
反对 回复 2021-05-24
?
GCT1015

TA贡献1827条经验 获得超4个赞

在几个项目中,我需要一个“观察者模式”类型的东西。 是最近项目中的可重用示例

它有一个相应的测试,显示了如何使用它。

基本理论是,Submit每当发生一些有趣的事件时,事件发射器都会调用一些数据。任何想要知道该事件的客户端都将Register通过其读取事件数据的通道。您注册的该通道可以select循环使用,也可以直接读取(或缓冲并轮询)。

完成后,您Unregister

它并非在所有情况下都是完美的(例如,对于慢速的观察者,我可能想要强制注销类型的事件),但是在我使用它的地方它可以工作。


查看完整回答
反对 回复 2021-05-24
?
茅侃侃

TA贡献1842条经验 获得超21个赞

Go为您提供了许多用于设计信号API的工具。

首先,您必须决定一些事情:

您要推还是拉模型?例如。发布者是将事件推送给订阅者还是订阅者从发布者中提取事件?

如果您想要一个推送系统,那么让订阅者为发布者提供一个发送消息的渠道就可以很好地工作。如果您要使用pull方法,那么仅一个带有互斥量的消息框将起作用。除此之外,在不了解您的要求的情况下,很难提供更多细节。


查看完整回答
反对 回复 2021-05-24
  • 3 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信