Как определить функцию отправки / получения с интерфейсом {} с помощью gob.Encoder ()

Мне нужно определить функции Send/Receive с помощью пакета gob.

Я определил Send() просто следующим образом:

func Send(enc *gob.Encoder, PKG interface{}) error {
    err := enc.Encode(PKG)
    return err
}

и Receive следующим образом:

func Receive(dec *gob.Decoder) (PKG interface{}) {

    err := dec.Decode(PKG)

    if err != nil {
        fmt.Println(PKG)
        Errors.Error(err, "Error receiving Package")
    }
    if PKG == nil {

        fmt.Println(PKG)
        Errors.Error(err, "Receiving empty Package")
    }
    return PKG
}

Я использую эти функции с разными типами: структуры, конкретные типы, йота ... Использую для проверки полученного типа сразу после вызова метода Receive.

Однако, к сожалению, я не достигаю контрольных точек. Эти методы (Send/Receive) определены неверно. Я получаю указатель <nil> (panic: Receiving empty Package) на стороне получателя, хотя все отправленные элементы экспортируются.

в настоящее время я пытаюсь отправить int следующего определенного типа:

type ProcessType int

const (
    COORDINATOR ProcessType = iota
    SENDER
    NORMALPROCESS
)

Я прочитал много документации, но не смог полностью разобраться в проблеме. Не могли бы вы дать ясное и ясное объяснение.

Что вы имеете в виду под «использованием этих функций с различными типами»? В общем, я бы посоветовал не использовать interface{}. Если вы хотите кодировать ProcessType, сделайте func EncodeProcessType(enc *gob.Encoder, pt ProcessType) error и его декодирующую копию. Да, это означает, что вы создаете по одной функции для каждого типа, это часть идеологии Go ясности, даже если она многословна. Это пример из документации о том, как использовать encoding/gob (play.golang.org/p/gjO2mlQZk9U).

mazei513 05.04.2021 08:39

Это еще один пример из документации (pkg.go.dev/encoding/gob#example-package-Basic), который представляет собой более простой пример использования пакета (play.golang.org/p/3PUi7glrtDp).

mazei513 05.04.2021 08:43

спасибо @ mazei513. Итак, как дождаться нескольких типов на сетевом сокете?

Mohamad-Jaafar NEHME 05.04.2021 16:17
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
3
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Передайте &PKG для кодирования и декодирования:

func Send(enc *gob.Encoder, PKG interface{}) error {
    // Pass &PKG to force encoder to send PKG as a dynamic value.
    err := enc.Encode(&PKG)
    return err
}

func Receive(dec *gob.Decoder) (PKG interface{}) {
    // Pass address of result.
    err := dec.Decode(&PKG)
    if err != nil {
        fmt.Println(PKG)
        log.Fatal(err, "Error receiving Package")
    }
    if PKG == nil {
        fmt.Println(PKG)
        log.Fatal(err, "Receiving empty Package")
    }
    return PKG
}

Сторона декодирования должна передавать в Send значения gob.Register всех возможных типов. Используйте этот код для примера йоты:

gob.Register(COORDINATOR) // any value of type ProcessType works.

Запустите код на игровой площадке.

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