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

如何在 Go 中设计连接器

如何在 Go 中设计连接器

Go
慕雪6442864 2021-06-02 22:02:12
我正在构建一个简单的连接器组件,具有以下职责:打开、保持和管理与外部服务的连接(即在后台运行)。将传入数据解析为逻辑消息并将这些消息传递给业务逻辑组件。从业务逻辑向外部服务发送逻辑消息。我还没有决定如何设计go中连接器的接口。变体 A) 入站通道,出站消息的函数调用// Listen for inbound messages.// Inbound messages are delivered to the provided channel.func Listen(msg chan *Message) {...}// Deliver msg to servicefunc Send(msg *Message) {...}变体 B) 用于入站和出站消息的通道// Listen for inbound messages + send outbound messages.// Inbound messages are delivered to the provided msgIn channel.// To send a message, put a message into the msgOut channel. func ListenAndSend(msgIn chan *Message, msgOut chan *Message) {...}变体 B 对我来说似乎更干净、更“像”,但我正在寻找以下问题的答案:有没有一种“惯用”的方式来做到这一点?或者,在哪些情况下应该首选变体 A 或 B?此类问题的任何其他显着变体?
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

这两种方法都只允许一个侦听器(除非您跟踪侦听器的数量,这是一种有些脆弱的方法),这是一个限制。这完全取决于您的编程偏好,但我可能会使用传入消息的回调和发送方法:


func OnReceive(func(*Message) bool) // If callback returns false, unregister it.


func Send(*Message)

除此之外,您提出的两个模型都是完全有效的。第二个似乎更“正交”。使用发送方法的一个优点是您可以确保它永远不会阻塞,而不是“裸”通道。


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

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