之前在做一些proto相关业务逻辑编写,在编写过程中,需要通过proto的message full name 去动态的创建一个proto.Message对象,在网上找一些相关的内容也没找到,所以就自己研究了一下并且实现了这个功能。
下面是proto v1版本实现代码。
//该实现仅用于proto v1版本实现 即 github.com/golang/protobuf 库
func parseRequest(msgName protoreflect.FullName, data []byte) (proto.Message,error) {
// 获取full name对应的message ,如果不存在则返回error
msgType, err := protoregistry.GlobalTypes.FindMessageByName(msgName)
if err != nil {
return nil, err
}
//上面返回的是一个message 反射类型,需要把它new出一个 protoreflect.Message类型然后转换成protoiface.MessageV1
//此时 根据源代码显示 proto.Message实现为 type Message = protoiface.MessageV1
//即type Message 为 protoiface.MessageV1 的别名
msg := proto.MessageV1(msgType.New())
err = proto.Unmarshal(data, msg)
if err != nil {
return nil, err
}
return msg, nil
}复制
proto v2版本实现如下
//该实现仅用于proto v2版本实现 即"google.golang.org/protobuf/proto"库
func parseRequest(msgName protoreflect.FullName, data []byte) (proto.Message,error) {
// 获取full name对应的message ,如果不存在则返回error
msgType, err := protoregistry.GlobalTypes.FindMessageByName(msgName)
if err != nil {
return nil, err
}
//上面返回的是一个message type 反射类型,需要把它new出一个 protoreflect.Message类型然后转换成protoreflect.ProtoMessage
//此时 根据源代码显示 proto.Message实现为 type Message = protoreflect.ProtoMessage
//即type Message 为 protoreflect.ProtoMessage的别名
msg := msgType.New().Interface()
err = proto.Unmarshal(data, msg)
if err != nil {
return nil, err
}
return msg, nil
}复制
整体业务流程是,传进一个proto的 full name 然后根据这个名字去创建对应的message,然后把data 解析到这个message中。
关于protov1 v2版本的区别,v2版本的动态特性更强。具体区别请看下面的链接 https://www.infoq.cn/article/dyX9bq5uFyK4hCEPgmuj[1]
References
[1]
https://www.infoq.cn/article/dyX9bq5uFyK4hCEPgmuj: https://www.infoq.cn/article/dyX9bq5uFyK4hCEPgmuj
文章转载自Echo的技术笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
1028次阅读
2025-04-09 15:33:27
2025年3月国产数据库大事记
墨天轮编辑部
650次阅读
2025-04-03 15:21:16
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
450次阅读
2025-04-10 15:35:48
征文大赛 |「码」上数据库—— KWDB 2025 创作者计划启动
KaiwuDB
435次阅读
2025-04-01 20:42:12
优炫数据库成功应用于国家电投集团青海海南州新能源电厂!
优炫软件
372次阅读
2025-03-21 10:34:08
数据库,没有关税却有壁垒
多明戈教你玩狼人杀
369次阅读
2025-04-11 09:38:42
天津市政府数据库框采结果公布!
通讯员
285次阅读
2025-04-10 12:32:35
最近我为什么不写评论国产数据库的文章了
白鳝的洞穴
266次阅读
2025-04-07 09:44:54
从HaloDB体验到国产数据库兼容性
多明戈教你玩狼人杀
253次阅读
2025-04-07 09:36:17
OceanBase 单机版发布,针对中小规模业务场景
通讯员
217次阅读
2025-03-28 12:01:19