如何使用 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
}

我将这些函数用于各种类型:结构、具体类型、iota...我使用在调用 Receive 方法后立即检查接收到的类型。

但是,不幸的是,我没有到达检查断点。这些方法 (Send/Receive) 定义错误。尽管所有发送的项目都已导出,但我在接收方收到了一个 <nil> 指针 (panic: Receiving empty Package)。

目前,我正在尝试发送以下定义类型的 int

type Processtype int

const (
    COORDINATOR Processtype = iota
    SENDER
    norMALPROCESS
)

我已经阅读了很多文档,但无法彻底理解这个问题。能否请您提供一个简洁明了的解释。

解决方法

通过 &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
}

解码端应该将所有可能类型的 gob.Register 值传递给 Send。将此代码用于 iota 示例:

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

Run the code on the Playground