0

我有一个非常复杂的结构,其中包含许多具有不同实现的接口。为了在 gob 中编码/解码该结构,我似乎必须注册每个可能用于每个接口的实现。所以我最终得到了一种方法:

func registerImplementations() {
    gob.Register(&Type1{})
    gob.Register(&Type2{})
    gob.Register(&Type3{})
    gob.Register(&Type4{})
    ....

}

我需要在编码/解码之前调用它。有没有更简单的方法来做到这一点?或者我应该研究生成这种方法的可能性,因为跟踪所有可能的实现非常乏味?

4

1 回答 1

0

文档说:

We must register the concrete type for the encoder and decoder (which would
normally be on a separate machine from the encoder). On each end, this tells the
engine which concrete type is being sent that implements the interface.

所以,在某些时候,你会想要调用gob.Register,但你确实希望你的代码是可维护的。这留下(大致)两个选择:

  • 像现在这样创建一个函数,一个接一个地调用每个结构。
    • 优点:您所有的Register电话都在一个列表中,因此如果您错过了一个,您很容易发现,而且您肯定不会注册两次。
    • 缺点:使用其他实现时必须更新它。您还必须在编码/解码之前调用此函数。
  • 创建这样的东西:

    func Register(i interface{}) error {
        gob.Register(i)
        return nil
    }
    

    然后在你的(比如说)dummy包中编写一个新的实现时,你可以把这一行放在接口声明的下面/上面。

    var regResult = reg.Register(myNewInterface{})
    

这将在启动时调用(因为它是全局的)。

  • 优点:不必更新registerImplementations方法。
  • 缺点:您的代码中的所有寄存器(可能包含很多文件) - 所以您可能会错过一个。

至于哪个更好:我会留给你。

于 2015-01-13T08:59:12.933 回答