我有一个非常复杂的结构,包含许多与每个不同实现的接口。对于en /解码gob中的结构,我似乎必须注册可能用于每个接口的每个实现。所以我最终得到了一个方法:
func registerImplementations() {
gob.Register(&Type1{})
gob.Register(&Type2{})
gob.Register(&Type3{})
gob.Register(&Type4{})
....
}
我需要在en / decode之前调用。有更简单的方法吗?或者我应该研究生成这种方法的可能性,因为跟踪所有可能的实现是非常繁琐的?
答案 0 :(得分: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
方法。 至于哪个更好:我会把它留给你。