登录
首页 >  Golang >  Go问答

在编译时使用 golang 解析未知类型的 protobuf3 消息的方法

来源:stackoverflow

时间:2024-03-10 18:51:27 335浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《在编译时使用 golang 解析未知类型的 protobuf3 消息的方法》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

这是一个场景:

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

例如,我在编写通用 kafka json 归档器时遇到了这个问题,该组件将:

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

如何仅从消息名称获取二进制字节的解串器?


解决方案


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 上放了一个完整的例子: https://github.com/rotemtam/pbreflect-example

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>