proto语法学习笔记

proto语法学习笔记

Protocol Buffers(Proto是由谷歌开发的一种数据序列化格式。
Proto 不是一种编程语言,而是一种接口描述语言(IDL),用于定义数据结构和消息格式。
它的设计目标是提供一种简单、高效、可扩展的方法来序列化结构化数据。

以下是 Protocol Buffers 的一些基本概念和语法:

1. 消息定义:(message)

Proto 使用消息定义来描述数据结构。消息是一组字段的集合,每个字段都有一个唯一的标识符和数据类型。

```proto
message Person {required int32 id = 1;required string name = 2;optional string email = 3;
}
```

2. 字段规则:(required必需) (optional可选) (repeated重复)

每个字段都有一个规则,指定了字段是必需的 (required)、可选的 (optional) 还是重复的 (repeated)。

  1. 字段类型: 字段可以是多种类型,例如整数、浮点数、字符串、枚举等。

    message MyMessage {required int32 my_int = 1;required string my_string = 2;optional bool my_bool = 3;repeated float my_float = 4;
    }
    

默认值:[default=]

每个字段可以有一个默认值。

```proto
message MyMessage {optional int32 my_int = 1 [default = 42];optional string my_string = 2 [default = "Hello"];
}
```

枚举:(enum)

Proto 支持枚举类型,用于定义一组命名的常量值。

```proto
enum Color {RED = 0;GREEN = 1;BLUE = 2;
}
```

服务定义:(service)

除了消息定义,Proto 还可以定义服务,其中包含 RPC(远程过程调用)方法的签名。

```proto
service MyService {rpc GetData (Request) returns (Response);
}
```

导入其他文件:(import)

可以使用 import 语句导入其他 Proto 文件,使得可以在一个文件中引用另一个文件定义的消息或服务。

```proto
import "other_file.proto";message MyMessage {required other_file.SomeMessage some_message = 1;
}
```

以上是 Protocol Buffers 的一些基本概念和语法。Proto 文件通常以 .proto 扩展名结尾。

在 Protocol Buffers(Proto)中,optionpackage 是两个关键的语法元素,它们用于在定义 Proto 文件时指定一些选项和组织结构。

包名:(package)

package 用于指定 Proto 文件的包名,有点类似于 Java 或 C# 的命名空间。它可以帮助组织和避免命名冲突。

package my_package;message MyMessage {required int32 my_field = 1;
}

在这个例子中,MyMessage 属于 my_package 包,生成的代码中可能会体现这个包的结构。

需要注意的是,package 的作用是在生成的代码中创建一个相应的命名空间,而不是指定文件的输出目录。生成代码的输出目录通常由编译器的命令行选项或构建工具配置文件指定。

选项:(option)

option 用于指定与编译器和其它工具相关的选项。它可以出现在文件级别、消息级别、字段级别等不同的层次上。通过 option,您可以配置各种选项,例如生成代码的语言、RPC 框架的使用方式等。

option java_package = "com.example";
option java_outer_classname = "MyProto";
option optimize_for = SPEED;

上述例子中,java_package 指定了生成 Java 代码时的包名,java_outer_classname 指定了生成的 Java 类的外部类名,optimize_for 则指定了优化策略。

C++手册:https://protobuf.dev/reference/cpp/cpp-generated/

跨语言

一旦定义了消息和服务,可以使用 Protocol Buffers 编译器将其编译成各种编程语言的代码,使得您可以在不同的编程语言中使用相同的数据结构和通信协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用STM32+SPI Flash模拟U盘

试验目的:使用STM32F103C8T6 SPI Flash(WSQ16)实现模拟U盘的功能 SPI Flash读写说明: Step1 设置SPI1 用于读取SPI Flash; Step2:设置SPI Flash 的使能信号 Step3:使能USB通信 Step4&#xf…

人机交互2——任务型多轮对话的控制和生成

1.自然语言理解模块 2.对话管理模块 3.自然语言生成模块

C++模拟如何实现vector的方法

任意位置插入,insert的返回值为新插入的第一个元素位置的迭代器;因为插入可能会进行扩容,导致start的值改变,所以先定义一个变量保存pos与start的相对位置;判断是否需要扩容;从插入位置开始,将所…

WorldWind Android上加载白模数据

这篇文章介绍下如何加载白模数据。这个白模数据的格式是shapefile格式的文件。白模数据拷贝到手机本地,然后读取白模数据,进行加载展示。 worldwind android本身是不支持加载白模数据的,但是可以根据现有提供的加载Polygons的方式&#xff0c…

【JUC】一篇通关JUC并发之共享模型

目录 1. 共享带来的问题1-1. 临界区 Critical Section1-2. 竞态条件 Race Condition1-3. synchronized 解决方案 1. 共享带来的问题 1-1. 临界区 Critical Section 一个程序运行多个线程本身是没有问题的问题出在多个线程访问共享资源 多个线程读共享资源其实也没有问题在多个…

基于单片机的消防巡逻小车设计

智能小车循迹与避障运动控制系统的设计 摘 要:本设计主要由STC89C52单片机来进行控制,通过输入输出两个端口控制驱动模块来调节电机的工作状态。本设计预利用机器视觉,通过识别条带状路标实现自主导航且利用超声波模块实时检测距离以实现避障功能&…

Linux:Ubuntu实现远程登陆

1、查看sshd服务是否存在 Ubuntu默认是没有安装sshd服务的,所以,无法远程登陆。 检查22端口是否存在 netstat -anp 该命令执行后,查看不到22端口的进程。 如果netstat无法使用,我们需要安装一下netstat服务 sudo apt-get install…

模板初阶(1):函数模板,类模板

一、函数模板 1.1 概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型产生函数的特定类型版本。 格式&#xff1a; template <typename T>或template <class T> template <class T>…

微信小程序内部跳到外部小程序

要在微信小程序中跳转到外部小程序&#xff0c;可以使用wx.navigateToMiniProgram函数。以下是一个示例&#xff1a; wx.navigateToMiniProgram({appId: 外部小程序的appId,path: 外部小程序的路径,extraData: {id: xxx},success(res) {// 跳转成功} })在这个示例中&#xff0…

jetson NX部署Yolov8

一,事情起因,由于需要对无人机机载识别算法进行更新,所以需要对yolov8算法进行部署到边缘端。 二,环境安装 安装虚拟环境管理工具,这个根据个人喜好。 我们需要选择能够在ARM架构上运行的conda,这里我们选择conda-forge 下载地址 安装即可 剩下的就是和conda 创建虚拟…

k8s上Pod全自动调度、定向调度、亲和性调度、污点和容忍调度详解

目录 一.Pod调度简介 二.Deployment/RC全自动调度 1.简介 2.案例演示 &#xff08;1&#xff09;Deployment &#xff08;2&#xff09;RC 三.nodeSelector/nodeName指定节点调度 1.原理简介 &#xff08;1&#xff09;nodeSelector原理 &#xff08;2&#xff09;no…

管理类联考——数学——汇总篇——知识点突破——应用题——路程——记忆

路程——【考频&#xff1a;高】——【解题提示&#xff1a;根据题意画图&#xff0c;找等量关系&#xff08;一般是时间和路程&#xff09;&#xff0c;列方程求解。】 【 应用题 ⟹ \Longrightarrow ⟹ 路程 ⟹ \Longrightarrow ⟹ 直线 ⟹ \Longrightarrow ⟹ 匀速、相遇、…

Kafka 集群如何实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

数字图像处理(实践篇)二 画出图像中目标的轮廓

目录 一 涉及的OpenCV函数 二 代码 三 效果图 一 涉及的OpenCV函数 contours, hierarchy cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) image&#xff1a;源图像。mode&#xff1a;轮廓的检索方式。cv2.RETR_EXTERNAL&#xff08;只检测…

Xcode:does not contain bitcode

1.错误描述 使用了第三方库错误提示如下&#xff1a; ld: xxx does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. xxx for architectur…

nvm安装及使用

文章目录 一、[介绍](https://github.com/nvm-sh/nvm)1.1、卸载node1.1.1、从控制面板的程序卸载node1.1.2、删除node的安装目录1.1.3、查找.npmrc文件删除1.1.4、逐一删除下列文件1.1.5、删除node环境变量1.1.6、验证是否卸载成功 二、安装2.1、window系统2.2、mac系统2.2.1、…

蓝桥杯第597题 跑步锻炼 C++ 日期模板题(模拟经典)

题目 跑步锻炼https://www.lanqiao.cn/problems/597/learning/?page1&first_category_id1&name%E8%B7%91%E6%AD%A5%E9%94%BB%E7%82%BC 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝每天都锻炼身…

基于uniapp的 电子书小程序——需求整理

前言 想开发一个很简单的 电子书阅读小程序&#xff0c;要怎么做的。下面从功能、数据库设计这一块来说一下。说不一定能从某个角度提供一些思路 开发语言 springcloud uniapp 小程序&#xff08;vue2&#xff09;mysql 说明 电子书的主题是电子书&#xff0c;我们在日常…

基于若依的ruoyi-nbcio流程管理系统增加流程节点配置(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 为了增加流程节点配置的功能的灵活性与方便性&#xff0c;这里增加流程节点的配置。 1、相应表结构如下&a…

apipost接口200状态码,浏览器控制台500状态码

后端 url 登录login方法 login(){this.$refs.loginForm.validate(async valid > {if (!valid) return// 由于data属性是一个json对象&#xff0c;需要进行解构赋值{data:result}&#xff0c;进行状态码判断const {data: result} await this.$http.post(/api/doLogin,this.…