如何使用 gob 定义带有 interface{} 的发送/接收函数。编码器()

我需要使用包定义一个函数。Send/Receivegob


我简单地定义如下: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

)

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


catspeake
浏览 89回答 1
1回答

蓝山帝景

传递以进行编码和解码:&PKGfunc Send(enc *gob.Encoder, PKG interface{}) error {&nbsp; &nbsp; // Pass &PKG to force encoder to send PKG as a dynamic value.&nbsp; &nbsp; err := enc.Encode(&PKG)&nbsp; &nbsp; return err}func Receive(dec *gob.Decoder) (PKG interface{}) {&nbsp; &nbsp; // Pass address of result.&nbsp; &nbsp; err := dec.Decode(&PKG)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(PKG)&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err, "Error receiving Package")&nbsp; &nbsp; }&nbsp; &nbsp; if PKG == nil {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(PKG)&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err, "Receiving empty Package")&nbsp; &nbsp; }&nbsp; &nbsp; return PKG}解码端应该去掉。注册传递给 Send 的所有可能类型的值。将此代码用于 iota 示例:gob.Register(COORDINATOR) // any value of type ProcessType works.在 Playground 上运行代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go