首页 > 解决方案 > 在 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}
}

但这迫使我做两件事:


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,
    }
}

但这确实很冗长,根据我生成发送者和接收者的方式,恐怕这会影响运行时速度/内存。

如果您已经遇到此类问题,我希望得到您的反馈以及您解决此问题的方式。我对您可能想要分享的任何理论想法也很感兴趣!

谢谢!

标签: algorithmgorefactoringstructure

解决方案


推荐阅读