为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
互换的青春 2023-05-22 17:18:05
这是一个场景:您正在 golang 中实现一个通用组件,它可以与任何类型的原型消息(二进制序列化)一起使用,并且需要在编译时不知道其类型的情况下反序列化二进制原型数据。例如,我在编写通用的 kafka json 归档程序时遇到了这个问题,该组件将:从配置中接收消息类型(字符串)和 kafka 主题的名称需要在运行时创建二进制 -> 内存解串器和内存 -> json 序列化器。你如何从消息名称中获得二进制字节的反序列化器?
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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

}

查看完整回答
反对 回复 2023-05-22
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信