algorithm - 在 golang 中的结构之间共享信息
问题描述
我有一个通用处理程序,其中包含它需要做的所有事情的数据。
type Handler struct {
info HandlerInfo
}
然后是发送者结构,它同样有自己的信息。
type Sender struct {
info SenderInfo
}
最后,还有一个接收器,它也有自己的信息。
type Receiver struct {
info ReceiverInfo
}
处理程序在程序执行过程中生成通信对。我不想举例说明我定义的不同结构之间发生的通信类型,因为我希望我的示例尽可能广泛。
func (h Handler) Do() {
for /* something happens */ {
sender := Sender{}
receiver := Receiver{}
}
sender.DoSomething()
if sender.ShouldSend() {
receiver.Receive()
}
}
到目前为止,一切看起来都很简单,但我面临两个问题:
1)如何处理Sender和Receiver共享的数据而没有冗余?
2)如何处理Handler使用但Sender和Receiver也需要使用的数据?
1)如何处理Sender和Receiver共享的数据而没有冗余?
有人可能会说,只需要一步一步地用他们需要的东西来填充这两个结构
但这使事情变得多余IMO:
func DoSomethingAndFill() {
data1 := generateSomeData1()
recv.Receive1(data1)
sender.Send1(data1)
data2 := generateSomeData2()
recv.Receive2(data2)
sender.Send2(data2)
}
我告诉自己我可以(从字面上)共享一个包含需要共享的数据的基本结构:
type MetaData struct {
Data1 Data
Data2 Data
}
type Sender struct {
*MetaData
info SenderInfo
}
type Receiver struct {
*MetaData
info ReceiverInfo
}
初始化时我只需要放置相同的指针?
func init() {
md := MetaData{}
recv, send := Receiver{&md}, Sender{&md}
}
但这迫使我做两件事:
一方面,如果我想让事情变得干净,为 Receiver 制作一个包,为 Sender 制作另一个包,我必须导出 MetaData 的所有字段,这虽然不是很糟糕,但并不理想。
另一方面,我不得不让代码更加混乱,因为在填充结构时,我必须在 Sender、Receiver 和 MetaData 的内容之间进行权衡。
2)如何处理Handler使用但Sender和Receiver也需要使用的数据?
我想到的第一件事是与父结构建立一种反向链接:
type Handler struct {
Info HandlerInfo
}
type Sender struct {
handler Handler
info SenderInfo
}
type Receiver struct {
handler Handler
info ReceiverInfo
}
func (h Handler) MakeRecvAndSend() {
recv, send := Receiver{
handler: h,
}, Sender{
handler: h,
}
}
乍一看,这似乎相当不错,但同样,如果 Sender 和 Receiver 在不同的包中,并且由于 Golang 中不允许循环导入,这是不可能的。
我想到的另一个解决方案是逐个复制相关信息:
type Handler struct {
info1 HandlerInfo
info2 HandlerInfo
}
type Sender struct {
handlerInfo HandlerInfo
info SenderInfo
}
type Receiver struct {
handlerInfo HanlderInfo
info ReceiverInfo
}
func (h Handler) MakeRecvAndSend() {
recv, send := Receiver{
handlerInfo: h.info1,
}, Sender{
handler: h.info2,
}
}
但这确实很冗长,根据我生成发送者和接收者的方式,恐怕这会影响运行时速度/内存。
如果您已经遇到此类问题,我希望得到您的反馈以及您解决此问题的方式。我对您可能想要分享的任何理论想法也很感兴趣!
谢谢!
解决方案
推荐阅读
- python-3.x - 从python中的表中删除sqllite3数据
- swift - 在协议中使用泛型
- python - 如何在python中将分钟转换为小时和分钟?
- .net - Issues with redirecting unauthorized requests based on whether it's an API call or not
- html - 更改表格第一行的颜色
- javascript - 播放按钮跟随 div 中的光标
- php - 正则表达式或语句
- couchbase - 将多节点 Couchbase 与 Springboot 集成
- azure - 创建 Azure Cloud Shell 存储时遇到问题
- r - 根据列中的最大值对列进行排序 - R 数据框排列