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

Generic interface for API with common functionality but different function parameters

我正在开发一项需要能够通过某种协议发送消息的物联网服务。我的目标是让我可以轻松地在这些协议实现之间进行切换。

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


示例:

MQTT

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

WAMP

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{} 类型。这反过来会迫使我做很多类型断言魔术和额外的工作来使它正常工作。

我是不是完全遗漏了一些明显的东西?什么是解决这个问题的更好方法?或者我应该完全不同地解决这个问题。

我建议创建您自己的 API(按照您需要的方式定义它),然后围绕每个实现您的 API 的库构建一个包装器。在每个包装器中,您可以按照库实现它的方式应用您需要的功能。 (我想这就是你正在尝试的。)

Publish 函数可能如下所示:

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

有效负载可以很容易地转换为 wamp.Dict,因为它也是 map[string]interfac{}。它也可以传递给 MQTT,因为它接受任何 interface{}.

不要试图从外部传入选项。而是根据需要在包装器中设置它们。或者,如果您需要与外部设置不同的设置,请定义您自己的设置并根据每个包的需要解释它们。

只有return个错误。在 MQTT 的情况下,正确解释 MQTT 包装器内的 Token