Go加入新版协议缓冲区API,但会无限期支持旧版本

Go官方宣布发布新的协议缓冲区(Protocol Buffers)API版本,其主要提供了反射(Reflection)功能,让开发者能够查看协议缓冲区类型系统的数值。协议缓冲区是独立于任何开发语言的数据交换格式,为串行化结构数据的扩展机制,与XML类似,但是更小更简单。

Go原本的协议缓冲区组件已经发布了十年,但是随着用户需求的增长,该组件也越来越不敷使用,Go官方提到,不少开发者使用Go反射组件,撰写程序来检查协议缓冲区的消息,但是因为反射组件只可查看Go的类型和数值,会忽略来自协议缓冲区类型系统的信息。官方举例,当开发者撰写一个走访日志项目,并且清除所有注释字段中敏感数据的函数,但是因为注释字段并非Go类型系统的一部分,所以处理起来就比较麻烦。

除此之外,开发者也有使用动态消息类型这类,非由协议缓冲区编译器产生的数据结构的需求。官方还提到,proto.Message接口也常是问题的来源,虽然该接口会识别生成消息类型的值,但是却几乎没有描述这些类型的行为,因此当用户创建实例接口的类型,并将类型数值传递给函数,想要取得生成消息值时,便常出现程序崩溃或是不可预期的行为。

官方表示,造成这三个问题的原因相同,而共同的解决方法,就是Message接口应该完全指定消息的行为,而且操作Message值的函数,应该接受任何正确实例该接口的类型。由于无法在不改动Message类型现有定义的情况下,维持组件API的兼容性,因此Go官方决定发布全新协议缓冲区模块,且新版本不与旧版本兼容。

而这个新版本的旗舰功能便是反射,提供类似反射组件查看Go类型和数值的功能,协议缓冲区的反射功能,则能根据协议缓冲区的类型,提供系统数值查看的能力,该组件包含了类型描述符,描述了来源文件和数值接口中定义的类型结构,其提供了检查和操作消息内容的能力。

官方把Go协议缓冲区原来的版本称为APIv1,而新版本称为APIv2,由于APIv1和APIv2不兼容,因此使用不同的模块路径。官方提到,因为每个开发者搬迁到新版本的速度不同,且部分程序可能会持续的使用旧版本,甚至在同一个程序中,也有可能会使用不同API版本,因此官方目前打算无限期地支持API​​v1。