前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Protobuf - 更小、更快、更简单的交互式数据语言

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

作者头像
frank.
发布2020-11-06 13:48:27
1.1K0
发布2020-11-06 13:48:27
举报

01 概念

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

02 基本语法

定义一个消息类型: 新建一个 user.proto 文件:

代码语言:javascript
复制
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 的一系列函数,其中序列化和反序列化函数比较常用,用来将数据序列化后进行传递。

序列化:

代码语言:javascript
复制
func proto.Marshal(m protoiface.MessageV1) ([]byte, error)

Marshal returns the wire-format encoding of m.

反序列化:

代码语言:javascript
复制
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 文件。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01 概念
  • 02 基本语法
  • 03 标量数据类型
  • 04 更多用法
  • 05 安装 protoc 编译器
  • 06 安装 protoc 插件
  • 07 使用 proto 包的函数操作 protobuf
  • 08 总结
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档