【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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:174778

评论

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

如何制定团队年度规划

老张

团队管理 项目管理

用户案例|GreptimeDB 助力贵州某机场智慧能源物联网系统

Greptime 格睿科技

数据库 rust 云原生 时序数据 用户案例

王牌驼,守护肠胃健康与营养均衡的生力军

科技热闻

Parallels Desktop 19 虚拟机如何安装?详细PD19图文安装教程 含激活版Windows镜像

Rose

Win11系统下载 Parallels Desktop 19 pd 19 虚拟机安装

PDF Squeezer for Mac(强大的PDF文件压缩工具)v4.5免激活版

影影绰绰一往直前

程序员的金三银四求职宝典

贺公子之数据科学与艺术

数字人的虚拟主播怎样直播带货?

青否数字人

数字人

Apeaksoft iOS Unlocker for Mac(iOS系统解锁工具)v1.0.56激活版

影影绰绰一往直前

从分享到共创:开放签电子签章系统在开源市场的成长之路与深化开源理念的实践

开放签开源电子签章

开源 电子合同 电子签章

GenAI助力DevOps,塑造软件工程的未来

SEAL安全

人工智能 DevOps 运维 GenAI

App应用程序(概念、开发步骤、技术要点介绍)

天津汇柏科技有限公司

定制软件开发 app定制开发 软件开发定制

人形机器人真的有规模可观的商用场景和消费需求吗?

算法的秘密

长生不老不再是梦想?数字永生技术颠覆认知!

青否数字人

数字人

数智融合,华为云GaussDB(for MySQL)助力企业释放数据新价值

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 华为云GaussDB(for MySQL)

王牌驼:带领4亿中国中老年群体领跑「精准营养」新时代

科技热闻

MestReNova 中文版:解析和解释核磁共振(NMR)和质谱(MS)数据

Rose

MestReNova软件 MestReNova14破解版 核磁共振 医学研究

4K Image Compressor Pro for Mac(4K图片压缩优化工具)v1.3.0激活版

影影绰绰一往直前

Mac FoneLab iPhone Password Manager for Mac(ios密码解锁)v1.0.18激活版

影影绰绰一往直前

虚拟数字人直播开发源码怎样选择?你知道吗?

青否数字人

数字人

文心一言 VS 讯飞星火 VS chatgpt (205)-- 算法导论15.4 1题

福大大架构师每日一题

福大大架构师每日一题

photoshop 2021 对显卡的要求 ps2021中文破解版安装包下载

Rose

ps2021破解版 Photoshop 2021 Photoshop 2021要求

Mac FoneLab iOS Unlocker for Mac(iPhone解锁工具)v1.0.58激活版

影影绰绰一往直前

Topaz Gigapixel AI for Mac(照片放大工具)v7.0.3激活版

影影绰绰一往直前

VMware Workstation (VM电脑虚拟机)激活精简版

Rose

VMware Fusion破解版下载 虚拟机安装 VM虚拟机密钥

AudKit Tidal Music Converter for Mac(HIFI音乐下载转换工具)v2.14.0激活版

影影绰绰一往直前

二叉搜索树(BST)

贺公子之数据科学与艺术

#算法

C4D 2024.3.2最新破解下载 c4d2024 mac中文版新功能介绍

Rose

3d建模 Cinema 4D 2024 c4d2024

QLab Pro for Mac(音频剪辑软件)v5.3.5激活版

影影绰绰一往直前

Desktop Stickers for Mac(桌面贴纸)v2.6激活版

影影绰绰一往直前

GlueMotion for Mac(简单实用的延时摄影软件)v2.2.2中文激活版

影影绰绰一往直前

GreptimeDB Roadmap 2024

Greptime 格睿科技

数据库 rust 云原生 时序数据库

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