Protobuf - 更小、更快、更简单的交互式数据语言

简介: Protobuf - 更小、更快、更简单的交互式数据语言

01

概念


Protocol buffers 是 Google 的一种语言中立、平台中立,可扩展,用于序列化结构化数据的交互式数据语言。相比 JSON、XML,它更小、更快、更简单。


02

基本语法


定义一个消息类型:

新建一个 user.proto 文件:


syntax = "proto3";
package message;
message UserRequest {
    int64 uid = 1;
    string username = 2;
}


  • .protoc 文件中非空、非注释的第一行,使用关键字 syntax 指定使用的是 proto3 语法,如果未使用关键字 syntax 指定,则默认使用 proto2 语法。
  • package 关键字,用来声明消息类型的可见范围。
  • UserRequest 消息类型共有 2 个字段,每个字段包含3 个属性:数据类型、字段名称和字段编号,其中字段名称和字段编号不可重复。


字段编号从 1 到 2^29 - 1(536,870,911),不可使用预留字段编号 19000-19999,其中 1-15 占用 1 字节,应该用于频繁出现的字段。


在一个.proto文件中,可以定义多个消息类型。


03

标量数据类型


Protobuf 生成的数据类型与原始类型并不完全一致,该表格展示了定义于 .proto 文件中的类型,以及与之对应的、在自动生成的访问类中定义的类型:


.proto Type
Notes
Go Type
double

float64
float

float32
int32
使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint32替代。 int32
int64
使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代。 int64
uint32
使用变长编码。 uint32
uint64
使用变长编码。 uint64
sint32
使用变长编码,这些编码在负值时比int32高效的多。 int32
sint64
使用变长编码,这些编码在负值时比int64高效的多。 int64
fixed32
总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。 uint32

续:

fixed64
总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。 uint64
sfixed32 总是4个字节。 int32
sfixed64
总是8个字节。 int64
bool

bool
string
一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。 string
bytes
可能包含任意顺序的字节数据。 []byte

04

更多用法


  • 默认值
  • enum
  • 嵌套
  • Any
  • oneof
  • map


限于篇幅,如需了解上述内容,请阅读文档。

官方文档:

https://developers.google.com/protocol-buffers/docs/proto3

中文翻译:

https://colobu.com/2017/03/16/Protobuf3-language-guide


05

安装 protoc 编译器


protoc 是 Protobuf 的编译器,结合插件将我们编写的 .proto 文件编译成我们需要的编程语言代码。


  1. 下载安装文件
    wget https://github.com/protocolbuffers/protobuf/releases/download/v3.13.0/protobuf-all-3.13.0.zip
  2. 解压缩
    unzip protobuf-all-3.13.0.zip
  3. 检查
    cd protobuf-all-3.13.0
    ./configure
  4. 编译
    make
  5. 安装
    make install


注意:安装过程中,可能会提示需要依赖库,可以根据错误提示安装依赖库。另外,如果你使用的是 macOS,系统已经预装了 protoc,无需重复安装。


06

安装 protoc 插件

protoc-gen-go(Go 代码生成插件


  1. 使用 go get 命令安装
    go get -u github.com/golang/protobuf/protoc-gen-go@v1.4.3
  2. 确保生成的 protoc-gen-go 可执行文件在相应的 bin 目录中。
  3. 编译 .proto 文件。
    protoc --go_out=. *.proto
  • --go_out:编译文件的存放目录
  • *.protoc 目标编译文件,*星号代表文件名的通配符


07

使用 proto 包的函数操作 protobuf


proto 包提供了操作 protobuf 的一系列函数,其中序列化和反序列化函数比较常用,用来将数据序列化后进行传递。


序列化:


func proto.Marshal(m protoiface.MessageV1) ([]byte, error)

Marshal returns the wire-format encoding of m.


反序列化:


func proto.Unmarshal(b []byte, m protoreflect.ProtoMessage) error

Unmarshal parses the wire-format message in b and places the result in m.


更多关于 proto 包的函数使用方法,请查阅文档:

https://pkg.go.dev/google.golang.org/protobuf/proto


08

总结


本文简单描述了 protobuf 的基本语法,如何安装 protoc 和 protoc 插件 protoc-gen-go,如何将 .proto 文件编译成 go 文件。通过阅读本文,读者应该可以完成编写.proto文件,并使用 protoc 编译器和插件生成 go 文件。





目录
相关文章
|
8月前
|
程序员 API C语言
在C++语言的标准I/O库
在C++语言的标准I/O库
52 0
|
存储 算法 数据处理
Python生成器深度解析:构建强大的数据处理管道
Python生成器深度解析:构建强大的数据处理管道
320 0
|
29天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
2月前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
115 1
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
37 2
|
4月前
|
存储 并行计算 大数据
优化Python数据处理性能的最佳实践
在数据科学和大数据时代,优化Python数据处理性能变得至关重要。通过探讨数据处理瓶颈、内存管理、并行计算以及高效库的使用,本篇文章旨在提供切实可行的最佳实践,以帮助开发者提升数据处理效率。
|
5月前
|
存储 算法 数据处理
|
5月前
|
机器学习/深度学习 数据采集 数据可视化
构建高效的数据管道:使用Python进行数据处理和分析
【8月更文挑战第24天】在信息爆炸的时代,数据是新的石油。本文将引导你如何利用Python构建一个高效的数据管道,从数据的获取、清洗到分析,最后实现可视化。我们将探索pandas、NumPy、matplotlib等库的强大功能,并通过实际案例加深理解。无论你是数据科学新手还是希望提升数据处理技能的开发者,这篇文章都将为你提供宝贵的洞见和实用技巧。
|
6月前
|
存储 大数据 数据处理
优化Python中的数据处理效率:使用生成器提升性能
在Python编程中,有效的数据处理是提升性能和效率的关键。本文将探讨如何利用生成器(generator)优化数据处理过程,通过实例展示生成器如何在内存效率和执行速度上带来显著提升。
|
7月前
|
NoSQL 安全 Go
Go 语言 mongox 库:简化操作、安全、高效、可扩展、BSON 构建
go mongox 是一个基于泛型的库,扩展了 MongoDB 的官方库。通过泛型技术,它实现了结构体与 MongoDB 集合的绑定,旨在提供类型安全和简化的数据操作。 go mongox 还引入链式调用,让文档操作更流畅,并且提供了丰富的 BSON 构建器和内置函数,简化了 BSON 数据的构建。 此外,它还支持插件化编程和内置多种钩子函数,为数据库操作前后的自定义逻辑提供灵活性,增强了应用的可扩展性和可维护性。
105 6