Мне нужно определить функции 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
)
Я прочитал много документации, но не смог полностью разобраться в проблеме. Не могли бы вы дать ясное и ясное объяснение.
Это еще один пример из документации (pkg.go.dev/encoding/gob#example-package-Basic), который представляет собой более простой пример использования пакета (play.golang.org/p/3PUi7glrtDp).
спасибо @ mazei513. Итак, как дождаться нескольких типов на сетевом сокете?

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