msgpack库的神奇用法

本文探讨了在使用MsgPack进行消息解码时遇到的问题及解决方案。通过巧妙地利用指针特性,避免了复杂的数据转换过程,提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一般来说,我们接收到消息,然后通过消息队列发送消息给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结构上!  这意味着我们不再需要重新定义一个新的结构体,而是组合这些结构体来实现我们的功能。

 

转载于:https://www.cnblogs.com/dearplain/p/7820965.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值