为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
catspeake 2022-08-24 11:26:00
我需要使用包定义一个函数。Send/Receivegob我简单地定义如下:Send()func Send(enc *gob.Encoder, PKG interface{}) error {    err := enc.Encode(PKG)    return err}如下:Receivefunc 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目前,我正在尝试发送以下定义类型的类型:inttype ProcessType intconst (    COORDINATOR ProcessType = iota    SENDER    NORMALPROCESS)我阅读了很多文档,但无法彻底理解这个问题。能否请您提供一个简洁明了的解释。
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

传递以进行编码和解码:&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 的所有可能类型的值。将此代码用于 iota 示例:


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

在 Playground 上运行代码。


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信