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

我正在设计一个程序包,在该程序包中,我想基于观察者模式提供API:也就是说,有些地方我想发出会触发零个或多个感兴趣方的信号。那些有兴趣的各方不必一定要彼此了解。

我知道我可以从头开始实现这样的API(例如,使用通道或回调函数的集合),但是我想知道是否存在构造此类API的首选方法。

在我使用过的许多语言或框架中,已经存在构建这些API的标准方法,以使它们按用户期望的方式运行:例如,g_signal_*基于glib的应用程序,事件和addEventListener()JavaScript DOM应用程序的功能,或用于。网。

Go有类似的东西吗?如果不是,是否还有其他方法可以构造这种在Go中更惯用的API?


一只斗牛犬
浏览 240回答 3
3回答

白板的微信

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

GCT1015

在几个项目中,我需要一个“观察者模式”类型的东西。 这是最近项目中的可重用示例。它有一个相应的测试,显示了如何使用它。基本理论是,Submit每当发生一些有趣的事件时,事件发射器都会调用一些数据。任何想要知道该事件的客户端都将Register通过其读取事件数据的通道。您注册的该通道可以select循环使用,也可以直接读取(或缓冲并轮询)。完成后,您Unregister。它并非在所有情况下都是完美的(例如,对于慢速的观察者,我可能想要强制注销类型的事件),但是在我使用它的地方它可以工作。

茅侃侃

Go为您提供了许多用于设计信号API的工具。首先,您必须决定一些事情:您要推还是拉模型?例如。发布者是将事件推送给订阅者还是订阅者从发布者中提取事件?如果您想要一个推送系统,那么让订阅者为发布者提供一个发送消息的渠道就可以很好地工作。如果您要使用pull方法,那么仅一个带有互斥量的消息框将起作用。除此之外,在不了解您的要求的情况下,很难提供更多细节。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go