0

我需要使用包定义一个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
)

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

4

1 回答 1

0

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

在 Playground 上运行代码

于 2021-04-05T05:58:53.117 回答