golang msgpck自定义行进

问题描述

我正在使用msgpack的golang项目中工作。在代码中存在以下注释

// We use a fast path for hot structs.

在这种情况下,某些结构实现了自己的marshall方法并具有类似于以下内容代码

func (z *struct) MarshalMsg(b []byte) (o []byte,err error) {
    o = msgp.Require(b,z.Msgsize())

    // string "Field1"
    o = append(o,0x88,0xa6,0x54,0x65,0x61,0x6d,0x49,0x64)

    o = msgp.AppendString(o,z.Field1)

    // string "Field2"
    o = append(o,0x55,0x73,0x72,0x64)
    o = msgp.AppendString(o,z.Field2)

    // string "Field3"
    o = append(o,0xa5,0x52,0x6f,0x6c,0x73)
    o = msgp.AppendString(o,z.Field3)
    return
}

我不确定这段代码到底能做什么,+您假设hot structs是什么意思,我假设它是自定义编组的?行 append(o,0x73)的作用是什么?

解决方法

代码特定答案

首先,您的代码是由MessagePack自动生成的,不应对其进行编辑。

所有apend(o,...)函数都将十六进制编码的字节添加到字节数组。每个附加项都以

的形式为结构中的一个字段提供给定标签
type test struct {
    Bar string `msg:"bar"`
}

例如“ field3”附加函数。如果将其打印为字符串,结果如下:�Roles

这是我的代码:

var b = []byte{}
b = append(b,0xa5,0x52,0x6f,0x6c,0x65,0x73)
fmt.Println(string(b))

第二个字段:�UserId

对于第一个字段:��TeamId

第一个函数msgp.Require表示字节数组的容量-数组的长度大于或等于结构中定义的某些消息大小字段。 请参阅文档https://godoc.org/github.com/tinylib/msgp/msgp#Require

#msgp软件包 该软件包是一个简单的代码生成器,可为MessagePack生成序列化方法。 (https://github.com/tinylib/msgp/wiki/Using-the-Code-Generator

我强烈建议您阅读Wiki和入门部分。 (https://github.com/tinylib/msgp/wiki/Getting-Started