写点什么

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

评论

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

景德镇等保测评企业有哪些?正规机构?

行云管家

等保 等级保护

部署基于LLM的私有知识库系统AnythingLLM

轶天下事

Chatbot 不是“万金油”:企业级生成式 AI 如何真正创造价值

Baihai IDP

程序员 AI chatbot Baihai IDP GenAI

数据要素在金融领域如何应用?

郑州埃文科技

智慧城市 数据要素

数据要素市场前景为何广阔?

郑州埃文科技

数据要素

Web3项目的上线流程

北京木奇移动技术有限公司

区块链技术 软件外包公司 web3开发

Crawl4AI:您的终极异步网络爬行伴侣 🕷️🤖

Barry的异想世界

爬虫 Crawl4AI

能效电气充电桩科普大讲堂全面升级!“千城千讲”盛大启航

极客天地

京东API接口深度探索:如何使用关键词搜索商品及代码示例详解

代码忍者

京东API接口 京东评论API接口

C#中:探索Task与CancellationTokenSource的高效协作

代码忍者

工业安全监测审计系统(源码+文档+部署+讲解)

深圳亥时科技

深入了解淘宝天猫API接口:商品详情查询与关键词搜索商品的高效使用指南及代码示例

代码忍者

淘宝API接口 淘宝评论API

我从 2024 年的 LLM 应用开发实践中学到了什么?Part 1

Baihai IDP

程序员 AI LLM Baihai IDP GenAI

拿捏!高效掌握离线数据,让数据资产快速释放价值

赛博威科技

离线数据 赛博威

GitHub 上排名前 11 的开源管理后台(Admin Dashboard)项目

NocoBase

GitHub 开源 低代码 无代码 dashboard

【GreatSQL优化器-08】statistics和index dives

GreatSQL

5分钟搞懂 Golang noCopy策略

俞凡

golang

你从未知道的 17 个令人惊叹的 GitHub 仓库

Barry的异想世界

GitHub Open Source

Artifacts:Claude 3.5 Sonent 最令人惊叹的用途

Barry的异想世界

Claude Claude 3.5 Sonnet Artifacts

项目调度工作平台(源码+文档+部署+讲解)

深圳亥时科技

华为 Mate 60 系列发布:从软件测试视角看科技创新的背后

测试人

软件测试

京东供应链创新与实践:应用数据驱动的库存选品和调拨算法提升履约效率

京东零售技术

供应链

官宣!雀巢携手赛博威,共同引领行业数字营销新变革!

赛博威科技

数字营销 赛博威

OpenAI O1模型革新金融研究与交易策略

Barry的异想世界

openai LLM openai o1

去哪儿机票智能预警系统-雷达系统落地实践

Qunar技术沙龙

技术 互联网 后端 雷达

设备泄漏检测与修复管理系统(源码+文档+部署+讲解)

深圳亥时科技

当AI遇见大数据:决策优化的下一个风口

天津汇柏科技有限公司

大数据 AI 人工智能

全方位破解终端运营管理的“最后一公里”难题

赛博威科技

终端 精细化运营 快消行业 赛博威

阿里云技术公开课:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot

阿里云大数据AI技术

人工智能 大数据 elasticsearch AI搜索

自学记录HarmonyOS Next Image API 13:图像处理与传输的开发实践

李游Leo

鸿蒙 HarmonyOS HarmonyOS NEXT

网络世界的守护者-等保测评你知道吗?

行云管家

网络安全 等保 等级保护 等保测评

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