【转】msgpack库的神奇用法

原文链接 https://www.cnblogs.com/dearplain/p/7820965.html

一般来说,我们接收到消息,然后通过消息队列发送消息给worker的时候,会有些额外的字段,这些字段不属于实际的消息,我们想把实际的消息和发给worker的消息分开定义。这时候我们会把worker消息中一个字段定义为interface{}或者object,这个字段表示任意的实际消息。

type WorkerMsg struct {
      ID  int
      Route string
      Msg interface{} // 实际消息
}

一切看起来很完美,但是问题来了,当我们用msgpack库decode消息到worker消息结构体的时候,这个Msg字段变成了一堆object的集合体,这时候,我们不得不再写一个函数把这些object,一个一个地复制到实际消息的结构体上,而这个函数是极其复杂的,很容易写错,而且性能也不好。

那么,我们还有更好的办法吗?其实我们可以这样写:

package main

import (
    "bytes"
    "fmt"

    "github.com/vmihailenco/msgpack"
)

type Abc struct {
    BB   int
    Haha int
}

type Msg struct {
    ID  int
    Msg interface{}
}

func main() {

    var msg Msg
    msg.Msg = Abc{BB: 2, Haha: 3}
    var buf bytes.Buffer
    msgpack.NewEncoder(&buf).StructAsArray(true).Encode(msg)
    data := buf.Bytes()
    
    var workerMsg Msg
    realMsg := &Abc{}
    workerMsg.Msg = realMsg
    msgpack.Unmarshal(data, &workerMsg)
    fmt.Println(workerMsg, realMsg)

}

可看到msgpack将数据解到msgD上,因为用的是指针,同时也解到了realMsg结构上!  这意味着我们不再需要重新定义一个新的结构体,而是组合这些结构体来实现我们的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
msgpack whl文件是一种用于安装`msgpack`的Python安装包文件。whl文件是Python的一种标准分发格式,其全称为"wheel",它是Python包管理器的一种打包格式。 `msgpack`是一种序列化,它可以将Python的对象序列化为二进制数据,然后再将其反序列化回Python对象。这种序列化方式具有高效性和可读性,并且可以跨多种编程语言使用。 使用`msgpack`可以在不同的系统之间传递数据,并且可以实现快速的数据交换和存储。它支持多种数据类型,包括整数、浮点数、字符串、列表、字典等等。与其他序列化方式相比,`msgpack`的数据大小更小,并且速度更快。 要使用`msgpack`,我们需要将其安装到Python环境中。而.whl文件则是一种用于Python包的安装文件格式。在安装whl文件之前,我们需要先确保已经安装了Python解释器和pip工具。 要使用whl文件安装msgpack,可以通过以下步骤进行: 1. 在Python环境中打开终端或命令提示符。 2. 切换到存放.whl文件的目录。 3. 运行以下命令: `pip install msgpack.whl` 执行上述命令后,pip将会自动从.whl文件中提取`msgpack`,并将其安装到Python环境中。安装完成后,我们就可以在Python程序中使用`msgpack`了。 总之,msgpack whl文件是一种用于安装msgpack的Python安装包文件,它可以实现高效的数据序列化和反序列化,并且支持多种数据类型。使用whl文件可以方便地将msgpack安装到Python环境中,从而在程序中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值