写点什么

Go 发布基于反射的新版 Protobuf API

  • 2020-03-24
  • 本文字数:1314 字

    阅读完需:约 4 分钟

Go发布基于反射的新版 Protobuf API

Go 的 protocol buffer 绑定是用于谷歌的语言无关的数据交换格式,旨在取代 JSON 用于高性能应用程序,目的是 protocol buffer 系统合并到Go 的类型系统中,并在运行时实现其操作。


protocol buffer提供了一种方法以指定用于传输结构化数据的模式。这种模式通常被转换成一种特定于编程语言的表示形式,称为绑定,使得使用高级别的接口处理 protobuf 消息变得更容易。


根据新protobuf模块版本的作者 Joe Tsai、Damien Neil 和 Herbie Ong 的说法,之前protobuf实现已经不能满足 Go 开发人员的期望了。具体来说,它虽然提供了 Go 类型和值的视图,但是忽略了 protocol buffer 类型系统中的信息。


这样做的后果就是 portobuf 注解的丢失。例如,我们可能想编写一个遍历日志条目并清除任何注解(annotation)为包含敏感数据的字段的函数。注解不是 Go 类型系统的一部分。


旧的 portobuf 模块的另一个局限是依赖于静态绑定,从而阻碍了动态消息的使用,而动态消息的类型在编译时不是完全可知的。


新的 protobuf 模块 (版本为 APIv2)基于这个假设:protobuf Message 必须完全指定消息的行为,并使用反射以提供 protobuf 类型的完整视图。Go protobuf APIv2 的基石是新的 proto.Message 接口,可用于所有生成的消息类型,并提供了访问消息内容的方式。这包括所有 protobuf 字段,可以使用 protoreflect.Message.Range 方式对它们进行迭代。该方法既可以处理动态消息,也可以访问消息选项。下面例子说明如何处理消息以在进一步处理前清除其包含的所有敏感信息:


// Redact清除pb中的每个敏感字段。func Redact(pb proto.Message) {    m := pb.ProtoReflect()    m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {        opts := fd.Options().(*descriptorpb.FieldOptions)        if proto.GetExtension(opts, policypb.E_NonSensitive).(bool) {            return true        }        m.Clear(fd)        return true    })}
复制代码


然而,几个Hacker News评论者指出,Go protobuf APIv2的版本控制有点让人感到困惑 。开发人员需要把新版本绑定到一个特定的存储库,而不能使用新的版本扩展现有的存储库,并把它标记为 v2。Damien Neil 解释了这一决定背后的原因,如下所示:


我们可以把新的 API 标记为 v2:

在导入路径中,把 v1 和 v2 清楚地区分开来。

让人感到困惑的:google.golang.org/protobuf@v1 不存在,而 v2 存在。

10 年后,希望没人关心这个旧的 github.com/golang/protobuf,那么,这个令人困惑的事就不存在了。

我们可以把新的 API 标记为 v1:

在导入路径中难以清楚地区分开来。

把 google.golang.org/protobuf 的第一个版本标记为 v1 是有意义的。

如果我们认为它是个糟糕的想法,那么,从 v1 转到 v2 比从 v2 回退到 v1 更容易一些。


此外,Go protobuf APIv2 将从 1.20 版开始。Neil 对此做了的解释,这样的目的是避免在错误报告中出现版本重叠产生的歧义, 他认为 Go protobuf APIv1 永远不会有 1.20 版。


最后要注意的是,APIv1 不会被 APIv2 淘汰,它会得到无限期维护。事实上,其最新的实现(1.4 版)是在 APIv2 之上实现的。


阅读原文:


Go Gets New Reflection-Based Protocol Buffers API


2020-03-24 11:175041

评论

发布
暂无评论
发现更多内容

Python创建虚拟环境报错:Error: Command......

codists

Python

鸿蒙Flutter实战:13-鸿蒙应用打包上架流程

星释

鸿蒙 HarmonyOS

微创软件海外拓展新动向:日本Cosmo Design公司被纳入版图

财见

使用 DFU 模式修复或恢复 Mac 固件

sysin

Mac DFU

伟创力收购JetCool以扩大数据中心和电源产品组合

财见

易未央-AI 風雲:4. AI與命理的交融

因田木

AI 陰陽五行

一次封装,解放双手:Requests如何实现0入侵请求与响应的智能加解密

LLLibra146

Python 代码技巧 requests 代码复用 自动加解密

thinkphp:判断数据是否存在,再作为数据库的判断条件(给数据库查询增加额外的查询条件)

百度搜索:蓝易云

phpstorm配置php运行环境

百度搜索:蓝易云

Windows - 内存优化

沉默的老李

内存 windows 11

哪些电子合同系统适合企业?9款详细介绍

爱吃小舅的鱼

电子合同系统

如何在 Go 项目中隐藏敏感信息,比如避免暴露用户密码?

左诗右码

寻找最佳合同电子签系统?10款实用方案

爱吃小舅的鱼

合同电子签系统

易未央-AI 風雲:5. 陰陽的失衡

因田木

AI 陰陽五行

需求管理和产品规划有什么异同点

易成研发中心

需求管理 需求管理工具

产品经理如何做好需求管理和分析

易成研发中心

需求管理 需求分析

亿珑能源控股有限公司与TMT Acquisition Corp完成合并

财见

Spring高手之路25——深入解析事务管理的切面本质

砖业洋__

spring 事务管理

数聚存储,智慧未来:浪潮信息分布式存储在人工智能时代的创新与应用

财见

ACCA联合发布《2024年中国共享服务领域调研报告》,揭示行业数智化转型新趋势

财见

做项目管理需要哪些技能

爱吃小舅的鱼

项目管理

Ubuntu下如何迁移Thunderbird邮件

百度搜索:蓝易云

LED显示屏的亮度真的是越高越好吗?

Dylan

屏幕亮度 LED显示屏 全彩LED显示屏 led显示屏厂家

体验免费开箱即用的AI工具:Blackbox.AI

袁袁袁袁满

人工智能 ChatGPT 免费AI工具 GPT-4o 大模型工具

IaaS、PaaS和SaaS的区别

兮动人

IaaS、PaaS和SaaS

缓存与主副本数据一致性系统设计方案(下篇)

HAibiiin

架构 系统设计 分布式系统 缓存一致性 主从架构

Python哪个框架合适开发速卖通商品详情api?

科普小能手

API Python框架 Python开发 API 接口 速卖通API接口

软件测试类文档,测试文档合集,软件全套资料集(原件)

金陵老街

软件文档 测试文档

鸿蒙原生开发手记:01-元服务开发

星释

鸿蒙 HarmonyOS

ext4文件系统镜像制作教程

百度搜索:蓝易云

解决虚拟机重启后ifconfig看不到IP的问题

百度搜索:蓝易云

Go发布基于反射的新版 Protobuf API_编程语言_Sergio De Simone_InfoQ精选文章