当前位置: 首页 > news >正文

proto3语法

1. 指明版本

.proto文件中使用proto3的语法需要在开头声明:

syntax="proto3"

2. 定义消息

syntax = "proto3";
 
message AddUserReq {
  string name = 1;
  string password = 2;
  sint64 group_id = 3;
}

消息的字段声明由4部分构成:字段修饰符 字段类型 字段名称 = 标志号

1) 字段修饰符

* singular : 默认值,该字段可以出现0次或者1次(不能超过1次)。

* repeated : 该字段可以重复任意多次(包括0次)。proto3中,repeated默认使用packed。

proto3中在语法层将required移除,singular是由optional改名而来。

2) 字段类型

.proto typeNotesC++ typeGo type
double doublefloat64
float floatfloat32
int32使用变长编码,对于负值的效率很低,如果该域有可能有负值,使用sint64替代int32int32
int64 int64int64
uint32使用变长编码uint32uint32
uint64使用变长编码uint64uint64
sint32使用变长编码,处理负值时比int32高效int32int32
sint64使用变长编码,处理负值时比int64高效int64int64
fixed32固定4个字节,如果数值总是比228大,此类型比uint32高效uint32uint32
fixed64固定8个字节,如果数值总是比256大,此类型比uint64高效uint64uint64
sfixed32固定4个字节int32int32
sfixed64固定8个字节int64int64
bool boolbool
string一个字符串,必须是UTF-8编码或7-bit ASCII编码stringstring
bytes可能包含任意顺序的字节数据string[]byte

默认值:

* string类型默认值是空字符串,不是null

* bytes类型默认是空bytes

* bool类型默认值是false

* 数字类型默认值是0

* 枚举类型默认值是第一个枚举值,即0

* repeated修饰的字段,默认值是空(在对应的编程语言中通常是一个空的list) 

3) 标志号

每一个被定义在消息中的字段都会被分配一个唯一的标量,这些标量用于标志定义在二进制消息格式中的属性。标量一旦被定义就不允许在使用过程中再次被改变。

1~15的标志号在编码的时候会占用一个字节,16~2047的标志号则占用两个字节,所以应该为频繁出现的消息元素保留1~15的标志号。

保留标识符(reserved)可以避免其他人在未来使用不该使用的标志号。

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

 

3. 枚举

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

Corpus枚举类型的第一个枚举值是0,每一个枚举值定义都会与一个常量映射,而这些常量的第一个常量必须为0。

 

4. 导入其它.proto中定义的消息

import "test/result.proto";

5. 包

可以为.proto文件指定包名,防止消息名冲突。

6. 服务定义

如果想在RPC中使用已经定义好的消息类型,可以在.proto文件中定一个消息服务接口,protocol buffer编译器会生成对应语言的接口代码。

service SearchService {
    //  方法名  方法参数                 返回值
    rpc Search(SearchRequest) returns (SearchResponse); 
}

  

 

转载于:https://www.cnblogs.com/xiaochuizi/p/9468006.html

相关文章:

  • JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识
  • Spring Data Redis—Pub/Sub(附Web项目源码)
  • 用面对对象方式定tab标签
  • Android 开发小知识点收集(随时更新)
  • 第二阶段冲刺8
  • 用shell脚本写的一个9*9乘法表
  • 导入项目后遇到页面报错如何解决
  • Ubuntu: how to md5sum (适用macOS)
  • Linux 磁盘配额 quota
  • crontab笔记
  • 互联网一线大厂都在用的Java架构师知识体系
  • linux 安全
  • centos中mysql,和配置ansible遇到的错误
  • 博客版权问题
  • Graph database_neo4j 底层存储结构分析(1)
  • Date型的使用
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • java多线程
  • jQuery(一)
  • Mithril.js 入门介绍
  • MySQL-事务管理(基础)
  • Python实现BT种子转化为磁力链接【实战】
  • SAP云平台里Global Account和Sub Account的关系
  • Spring Cloud Feign的两种使用姿势
  • vue--为什么data属性必须是一个函数
  • 高程读书笔记 第六章 面向对象程序设计
  • ------- 计算机网络基础
  • 将回调地狱按在地上摩擦的Promise
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 利用jquery编写加法运算验证码
  • 前端相关框架总和
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 实现简单的正则表达式引擎
  • 手机端车牌号码键盘的vue组件
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个JAVA程序员成长之路分享
  • 移动端 h5开发相关内容总结(三)
  • 用mpvue开发微信小程序
  • nb
  • 带你开发类似Pokemon Go的AR游戏
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ###项目技术发展史
  • #Linux(make工具和makefile文件以及makefile语法)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)Android开发优化---------UI优化
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (31)对象的克隆
  • (4) PIVOT 和 UPIVOT 的使用
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...