【问题标题】:golang msgpck custom marchallinggolang msgpack 自定义编组
【发布时间】:2020-09-20 23:01:47
【问题描述】:

我正在开发一个使用 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, 0xa6, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64)
    o = msgp.AppendString(o, z.Field2)

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

我不确定这段代码究竟做了什么,+ hot structs 是什么意思我假设它是自定义编组?还有 append(o, 0xa5, 0x52, 0x6f, 0x6c, 0x65, 0x73) 行是做什么的?

【问题讨论】:

    标签: go msgpack


    【解决方案1】:

    代码具体答案

    首先,您的代码是由 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2021-01-03
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      相关资源
      最近更新 更多