En / Decode结构包含许多具有不同实现的接口,每个接口都有gob

时间:2015-01-12 22:32:08

标签: go gob go-interface

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

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

}

我需要在en / decode之前调用。有更简单的方法吗?或者我应该研究生成这种方法的可能性,因为跟踪所有可能的实现是非常繁琐的?

1 个答案:

答案 0 :(得分:0)

documentation说:

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方法。
  • 缺点:您的代码中都有您的注册表(可能包含大量文件) - 所以您可能会错过一个。

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