HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

评论

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

Linux数据流重定向

王坤祥

Linux linux操作

散列表高级应用之把用户访问记录优化到极致

架构师修行之路

哈希表 数据结构与算法

翻译:如何编写Golang代码(How to Write Go Code)

申屠鹏会

翻译 Go 语言

Mac JetBrains(IDE)常用快捷键

王坤祥

JetBrains 快捷键

物流与区块链加供应链的现状与未来趋势

CECBC

行业资讯 区块链技术 供应链

定义“开发者关系”

开发者关系

开发者关系 开发者运营 技术运营 开源社区

二叉树的遍历(前序、中序、后序)

申屠鹏会

算法 二叉树 Go 语言

webbench源码阅读

我是程序员小贱

同行分析优化

誓约·追光者

Sparksql 优化

在龙门吊上,看到破浪而来的智能时代

脑极体

k8s-client-go源码剖析(一)

远鹏

开源 Kubernetes 容器 源码剖析 Go 语言

TCP/IP学习(1):创建套接字

申屠鹏会

TCP 网络 TCP/IP

跟我一起基于 Karma 搭建一个测试环境 (中)

Jack Q

大前端 Karma 测试框架搭建

跟我一起基于Karma搭建一个测试环境(上)

Jack Q

大前端 Karma 测试框架搭建

开发者关系(DevRel)的新手指南

开发者关系

开发者关系 开发者运营 技术运营 开源社区

360 Atlas生产环境使用心得

心平气和

MySQL 分库分表 Proxy Atlas

突破内存限制的高性能排序

架构师修行之路

范型的下一步

申屠鹏会

翻译 Go 语言

平时开发Git常用的小技巧

zui.zhang

git rebase

随着区块链技术的成熟,全球企业开始拥抱公共区块链

CECBC

区块链技术 公共区块链

Linux后台开发高频题目总结

我是程序员小贱

troubleshoot之:GC调优到底是什么

程序那些事

性能分析 jvm调优 GC调优

学习总结 -- Week 10

吴炳华

9个典型的开发者关系面试题

开发者关系

开发者关系 开发者运营 技术运营 开源社区

Linux之crontab命令

王坤祥

Linux crontab

计算机网络基础(十九)---传输层-TCP的拥塞控制

书旅

TCP 协议栈 网络层

彻底解决雪花算法时间回拨问题新方案

柿子

算法 雪花算法

RPC原理

石刻掌纹

TypeScript 设计模式之观察者模式

Geek_z9ygea

typescript 大前端 设计模式

今天给二叉树加个BGM,二叉树唱歌了!

我是程序员小贱

瀑布模型总结

我是程序员小贱

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