猿问

具有通用功能但功能参数不同的 API 的通用接口

我正在开发一种物联网服务,该服务需要能够通过某种协议发送消息。我的目标是让我更容易在这些协议实现之间切换。

在物联网中,用于消息传递的两种常见协议是MQTT和WAMP。用于这些协议的两个流行的Go库都有相似的接口,但是它们各自的函数实现的参数不同。


例:

断续器

Publish(topic string, qos byte, retained bool, payload interface{}) Token

万普

Publish(topic string, options wamp.Dict, args wamp.List, kwargs wamp.Dict) error

我最初的想法是定义一个通用接口,在其中筛选出我真正需要的所有参数:

Publish(topic string, payload map[string]interface{}, options map[string]interface{}) map[string]interface{}

但是,由于对于两个库,签名完全不同,因此我被迫使用该类型。这反过来又会迫使我做很多类型断言魔术和额外的工作来使这项工作正常工作。interface{}

我是否完全错过了一些明显的东西?这个问题的更好解决方案是什么?或者我应该以完全不同的方式解决这个问题。


慕码人2483693
浏览 118回答 1
1回答

猛跑小猪

我建议创建自己的API(按照您需要的方式定义它),然后围绕实现API的每个库构建一个包装器。在每个包装器中,您可以按照库实现它的方式应用所需的功能。(我想这就是你正在尝试的。该函数可能如下所示:PublishPublish(topic string, payload map[string]interface{}) error有效负载可以很容易地转换为,因为它也是一个.它也可以传递给 MQTT,因为它接受任何 .wamp.Dictmap[string]interfac{}interface{}不要试图从外部传递选项。而是根据需要在包装器中设置它们。或者,如果您需要将它们与外部设置不同,请定义自己的设置,并根据每个包的需要解释它们。仅返回错误。在 MQTT 的情况下,请正确解释 MQTT 的包装器内部。Token
随时随地看视频慕课网APP

相关分类

Go
我要回答