Структура 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 метод.
  • Недостаток: у вас будут все регистры по всему коду (который может состоять из множества файлов) - так что вы можете пропустить один.

Что лучше: я оставлю это на ваше усмотрение.

Другие вопросы по тегам