Структура en/Decode, содержащая много интерфейсов с различными реализациями, каждый с gob
У меня есть довольно сложная структура, которая содержит много интерфейсов с различными реализациями. Для en / decoding этой структуры в gob я, кажется, должен зарегистрировать каждую реализацию, которая может быть использована для каждого интерфейса. Итак, я в конечном итоге с методом по этим направлениям:
func registerImplementations() {
gob.Register(&Type1{})
gob.Register(&Type2{})
gob.Register(&Type3{})
gob.Register(&Type4{})
....
}
который мне нужно позвонить до en / decoding. Есть ли более простой способ сделать это? Или я должен изучить возможности для генерации этого метода, так как довольно утомительно отслеживать все возможные реализации?
1 ответ
В документации сказано:
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
метод. - Недостаток: у вас будут все регистры по всему коду (который может состоять из множества файлов) - так что вы можете пропустить один.
Что лучше: я оставлю это на ваше усмотрение.