gpt4 book ai didi

go - 如何使用 golang 在编译时不知道其类型的情况下解析 protobuf3 消息?

转载 作者:数据小太阳 更新时间:2023-10-29 03:21:02 25 4
gpt4 key购买 nike

这是一个场景:

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

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

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

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

最佳答案

golang 原型(prototype)库有一个用于此目的的辅助实用程序:

// 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

关于go - 如何使用 golang 在编译时不知道其类型的情况下解析 protobuf3 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53968966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com