如何在golang编译时不知道protobuf3消息类型的情况下解析它?

时间:2018-12-29 11:07:40

标签: go reflection protocol-buffers

这是一个场景:

您正在golang中实现一个通用组件,该组件可以与任何类型的原始消息(二进制序列化)一起使用,并且需要在不知道其类型的情况下对二进制原始数据进行反序列化。

例如,我在编写通用的kafka json存档程序时遇到了此问题,该组件将:

  • 从配置和kafka主题名称中接收消息类型(字符串)
  • 需要在运行时创建二进制->内存解串器和内存-> json序列化器。

如何仅从消息名称中获取二进制字节的反序列化器?

1 个答案:

答案 0 :(得分:0)

golang原型库具有用于此目的的帮助程序实用程序:

// MessageType returns the message type (pointer to struct) for a named message.
// The type is not guaranteed to implement proto.Message if the name refers to a
// map entry.
func MessageType(name string) reflect.Type {
   // ....
}

要使用它,可以使用类似于以下方法的方法:

func getProto(messageType string, messageBytes []byte) proto.Message {
    pbtype := proto.MessageType(messageType)
    msg := reflect.New(pbtype.Elem()).Interface().(proto.Message)
    proto.Unmarshal(messageBytes, msg)
    return msg
}

我在github上做了一个完整的例子: enter image description here