1、说明

示例中的proto文件描述了一个数据结构,遵循 Protobuf 语法

示例:

message TestOne {
required string name = 1;
optional int32 age = 2;
}

2、字段类型

type C++ type Java Type Python Type description
double double double float
float float float float
int32 int int int
uint32 uint32 int int/long
int64 int64 long int/long
uint64 uint64 long int/long
sint32 int32 int int 存数据时引入zigzag编码
(Zigzag(n) = (n << 1) ^ (n >> 31)
解决负数太占空间的问题
正负数最多占用5个字节,内存高效
sint64 int64 long int/long
fixed32 uint32 int int/long 4 byte
抛弃了可变长存储策略
适用与存储数值较大数据
fixed64 uint64 long int/long
sfixed32 int32 int int
sfixed64 int64 long int/long
bool bool boolean bool
string string String unicode
bytes string ByteString bytes
  1. 负数使用 sint
  2. 数值较大,使用 fixed

3、字段规则

示例中的 required 和 optional 都是字段规则,规则有以下几个:

字段规则 说明
required 格式良好的 message 必须包含该字段一次
optional 格式良好的 message 可以包含该字段零次或一次(不超过一次)
repeated 该字段可以在格式良好的消息中重复任意多次(包括零)
其中重复值的顺序会被保留。

optional 字段是可选字段,如果不设定数据,则需要有一个默认值以避免出错,指定方式:

message TestOne {
required string name = 1;
optional int32 age = 2 [default = 100];
}

4、字段编号

如示例中,每个字段都有一个编号,这些编号是 唯一的

  • 编号1-15会占用一个字节,16-2047占用两个字节,因此尽可能使用1-15;

  • 字段编号在 message 被使用后,就不能再更改;

5、注释

支持使用 C/C++ 风格的注释

6、类型

6.1、message

  • message 表示一个类型,后面的名称将会是类名;
  • 一个proto文件可以定义多种 message 类型,但尽可能减少一个proto多类型的情况;

组合 messages 会导致膨胀虽然可以在单个 .proto 文件中定义多种 messages 类型(例如 message,enum 和 service),但是当在单个文件中定义了大量具有不同依赖关系的 messages 时,它也会导致依赖性膨胀。建议每个 .proto 文件包含尽可能少的 message 类型。

6.2、service

一般在和RPC系统一起使用,示例:

service TestService {
rpc Test (TestRequest) returns (TestResponse);
}

7、枚举enum

枚举定在 message 内部

示例:

message TestOne {
required string name = 1;
optional int32 age = 2 [default = 100]; enum Country {
China = 0;
USA = 1;
}
optional Country country = 3 [default = China]
}

8、保留字段

示例:

下面例子,字段编号2/15/9/11曾经使用过,保留;字段名 foo/bar 曾经使用过,保留

message Foo {
reserved 2, 15, 9 to 11;
reserved "foo", "bar";
}

如果一个字段不再需要,如果删除或者注释掉,则其他人在修改时会再次使用这些字段编号,那么旧的引用程序就可能出现一些错误,所以使用保留字段,保留已弃用的字段编号或字段名 ,可解决该问题

9、import

如果一个 proto 文件需要使用另一个 proto 文件中的定义(message/service),就需要使用 import 引入其他的 proto 文件

import 使用 public 属性,控制依赖是否可以传递,被 public 修饰的可以传递

示例:

//second.proto
import "message/aaa.proto";
import public "message/bbb.proto";
//test_one.proto
import "message/second.proto"; message TestOne {
required string name = 1;
optional int32 age = 2 [default = 100];
}

如上示例中,test_one.proto 中可以使用 bbb.proto 的类型,但不能使用 aaa.proto 中的类型

9.1、protoc指令

protoc 的参数 -I--proto_path 用于传递 import 的路径

当不同的 proto 文件位于不同的路径时,import 可以不传递相对路径,而使用 -I 或者 --proto_path 传递 import 的查找路径

Protobuf之proto基础语法的更多相关文章

  1. proto 3 语法

    一.简介 proto3是新版本的protobuf语法.它简化了部分语法,并扩大了支持的语言,Ruby.C#.目前谷歌推荐只在是用新支持的语言或使用新的gRPC框架的时候使用.proto2和proto3 ...

  2. proto 2 语法

    一.proto文件 PB的定义是通过proto文件进行定义的,一个标准的类型如下: message SearchRequest { required string query = 1; optiona ...

  3. iOS 集成Protobuf,转换proto文件

    原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...

  4. [Go] 环境变量,模块化与基础语法

    [环境变量] 安装完 go 之后,设置必要环境变量: export GOPATH=/home/wc/go-lab export GO111MODULE=on export GOPROXY=https: ...

  5. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  6. iOS-----正则表达式的基础语法

    正则表达式简单语法总结 一.什么是正则表达式 从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式.那么一个正 ...

  7. python之最强王者(2)——python基础语法

    背景介绍:由于本人一直做java开发,也是从txt开始写hello,world,使用javac命令编译,一直到使用myeclipse,其中的道理和辛酸都懂(请容许我擦干眼角的泪水),所以对于pytho ...

  8. emmet 系列(1)基础语法

    emmet 系列(1)基础语法 emmet 是一个能显著提升开发html和css开发效率的web开发者工具 emmet基本上目前已知的编辑器都有相应的插件,各个编辑器的emmet插件的下载地址:点我下 ...

  9. Scala基础语法 (一)

    如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...

  10. Java基础语法

    java基础学习总结——基础语法1 一.标识符

随机推荐

  1. 分享几个常用的运维 shell 脚本

    今天咸鱼给大家分享几个不错的 Linux 运维脚本,这些脚本中大量使用了 Linux 的文本三剑客: 1. awk 2. grep 3. sed 建议大家这三个工具都要了解并最好能够较为熟练的使用 根 ...

  2. 图扑 Web SCADA 智慧钢厂能源监控 HMI

    前言 钢铁行业作为我国的支柱产业,也是我国能源消耗的重点行业之一,随着国家节能减排政策的推进,有效实施能源管控是企业提高能源绩效.降低能源成本和提高核心竞争力的重要途径. 通过对钢铁企业能耗现状和能源 ...

  3. Django 对实体的增删改查样例

    class UserInfo(models.Model): """ 人员信息 """ user_id = models.CharField( ...

  4. vue 文件路径获取文件名

    例如: url 是//resource//20220819//kfz//调试.zip转换后结果为 调试.zip//文件路径获取文件名 getFileName(url) { let name = &qu ...

  5. 【驱动】SPI驱动分析(七)-SPI驱动常用调试方法

    用户态 用户应用层使用spidev驱动的步骤如下: 打开SPI设备文件:用户可以通过打开/dev/spidevX.Y文件来访问SPI设备,其中X是SPI控制器的编号,Y是SPI设备的编号. 配置SPI ...

  6. [Vue] Computed property "XXX" was assigned to but it has no setter.

    阅读这篇文章:https://blog.csdn.net/weixin_34090562/article/details/91369638 全选,通过计算属性计算得来.结果报错Computed pro ...

  7. 如果诸葛亮会编程,用Java写出师表...

    继上一篇 "如果诸葛亮用C#写出师表..."后,站长想自己的第一语言是Java,虽然平时工作上用的不多,也用Java实现一遍吧,改改就是了,无非就是: C#的Console.Wri ...

  8. phpcms - 获取单网页 , 例如关于我们

       {pc:get sql="select * from phpcms_page where catid=2" num="1"}         {loop  ...

  9. IBM jca 工具的学习与整理

    IBM jca 工具的学习与整理 背景 发现自己最早看到IBM这个工具的时间是 2022年9月份. 但是一直没有进行过仔细的学习与论证. 本周出现了一个问题. 虽然通过gclog明显看出来是一个oom ...

  10. tidb备份恢复的方式方法

    tidb备份恢复的方式方法 摘要 可以单独每个数据库实例进行备份,但是这种机制实在是太慢了. 网上查资料发现可以使用 tiup br 的方式进行备份. 但是大部分文档都比较陈旧, 官网上面又比较贴心的 ...