问题描述
我正在使用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)