go - 具有通用功能但功能参数不同的 API 的通用接口
问题描述
我正在开发一项物联网服务,该服务需要能够通过某种协议发送消息。我的目标是让我可以轻松地在这些协议实现之间进行交换。
在物联网中,用于消息传递的两种常见协议是 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{}
.
不要试图从外部传递选项。而是根据需要在包装器中设置它们。或者,如果您需要对它们进行与外部不同的设置,请定义您自己的并根据每个包的需要对其进行解释。
只返回一个错误。在 MQTT 的情况下,Token
正确解释 MQTT 包装器内部的内容。
推荐阅读
- angular - 当资源部件发生变化时如何停止自动重新加载?
- c++ - c++ 将 typedef 与 LegacyRandomAccessIterator 一起使用
- dax - DAX-如何实现每个类别的年初至今?
- android - 如何将我的 Android 应用程序与 mongodb.atlas 连接?
- android - 如何为 App Store 添加关联域?- 用于 App Store Connect 的 app-ads.txt 文件
- rpm-spec - 如何在 rpm 规范中自动创建许多子包
- android - 我得到了 java.lang.IllegalStateException: 更新 androidX 库时没有活动错误
- java - 反向单链表
- amazon-web-services - Alexa 请求客户联系访问被拒绝
- ansible - RubyEncoder CLI 模式安装期间的问题