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

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 编译器将其编译成各种编程语言的代码,使得您可以在不同的编程语言中使用相同的数据结构和通信协议。

相关文章:

proto语法学习笔记

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

python-nmap库使用教程(Nmap网络扫描器的Python接口)(功能:主机发现、端口扫描、操作系统识别等)

文章目录 Python-nmap库使用教程前置条件引入python-nmap创建Nmap扫描实例执行简单的主机发现(nmap -sn)示例,我有一台主机配置为不响应 ICMP 请求,但使用nmap -sn,仍然能够探测到设备: 端口扫描扫描特定端…...

什么是智慧工地?

一、什么是智慧工地? 工地本身不拥有智慧,工地的运作是依赖于人的智慧。工地信息化技术,能够减少对人的依赖,使工地拥有智慧。 智慧工地,就是立足于“智慧城市”和“互联网”,采用云计算、大数据和物联网等…...

【古月居《ros入门21讲》学习笔记】08_发布者Publisher的编程实现

目录 说明: 1. 话题模型 图示 说明 2. 实现过程(C) 创建功能包 创建发布者代码(C) 配置发布者代码编译规则 编译并运行 编译 运行 3. 实现过程(Python) 创建发布者代码(…...

沿着马可·波罗的足迹,看数字云南

刚入行的时候,有位前辈跟我说过一句话:去现场“要像外国人一样去看”,重新审视那些自己可能早已“熟视无睹”的事物。 前不久,我跟随“看见数字云南——云南数字经济媒体探营活动”,奔赴昆明、大理、西双版纳等地&…...

记录问题-使用@Validated报错Validation failed for argument [0]

类字段 NotNull(message "双坐标不能为空", groups {Insert.class, Update.class})private Integer yAxisType;接口 /*** 添加** return*/RequestMapping(value "/add", method RequestMethod.POST)public Result add(Validated(Insert.class) Request…...

three.js--立方体

作者:baekpcyyy🐟 使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根…...

App的测试,和传统软件测试有哪些区别?应该增加哪些方面的测试用例?

从上图可知,测试人员所测项目占比中,App测试占比是最高的。 这就意味着学习期间,我们要花最多的精力去学App的各类测试。也意味着我们找工作前,就得知道,App的测试点是什么,App功能我们得会测试&#xff0…...

改进LiteOS中物理内存分配算法(详细实验步骤+相关源码解读)

一、实验要求 优化TLSF算法,将Best-fit策略优化为Good-fit策略,进一步降低时间复杂度至O(1)。 优化思路: 1.初始化时预先为每个索引中的内存块挂上若干空闲块,在实际分配时避免分割(split)操作&#xff…...

洛谷100题DAY8

36.P1416 攻击火星 此题找出规律即可 #include<bits/stdc.h> using namespace std; int n; int main() {cin >> n;cout << max(0, n - 2);return 0; } 37.P1551 亲戚 并查集模板题目 两个人如果使亲戚就合并建立联系&#xff0c;最后进行查找即可 #incl…...

2. OpenHarmony源码下载

OpenHarmony源码下载(windows, ubuntu) 现在的 OpenHarmony 4.0 源码已经有了&#xff0c;在 https://gitee.com/openharmony 地址中&#xff0c;描述了源码获取的方式。下来先写下 windows 的获取方式&#xff0c;再写 ubuntu 的获取方式。 获取源码前&#xff0c;还需要的准…...

flask app.config 用法

flask app.config flask app.config 是 Flask 应用程序的配置对象。它包含了 Flask 应用程序的所有配置信息&#xff0c;如数据库连接、密钥、调试模式等。 常用的 app.config 配置项如下&#xff1a; DEBUG&#xff1a;调试模式&#xff0c;默认为 False。 SECRET_KEY&…...

【Vue】【uni-app】实现工单列表项详情页面

这次主要实现的是一个工单详情页面 从工单列表项中点击详情 跳转到工单详情页面&#xff0c;这个详情页面就是这次我们要实现的页面&#xff0c;并可以通过点击这个关闭按钮返回到工单列表页面 首先是在我们原有的工单列表页面的按钮增加一个点击跳转 <button size"m…...

安装vmware_esxi 超详细

安装vmware_esxi 超详细 </h2><div id"cnblogs_post_body" class"blogpost-body blogpost-body-html">esxi安装手册 1、esxi介绍 ESXI原生架构模式的虚拟化技术&#xff0c;是不需要宿主操作系统的&#xff0c;它自己本身就是操作系统。因此…...

Spring-Mybatis源码解析--手写代码实现Spring整合Mybatis

文章目录 前言一、引入&#xff1a;二、准备工作&#xff1a;2.1 引入依赖2.2 数据源的文件&#xff1a;2.1 数据源&#xff1a; 2.3 业务文件&#xff1a; 三、整合的实现&#xff1a;3.1 xxxMapper 接口的扫描&#xff1a;3.2 xxxMapper 接口代理对象的生成&#xff1a;3.2 S…...

5.2 Windows驱动开发:内核取KERNEL模块基址

模块是程序加载时被动态装载的&#xff0c;模块在装载后其存在于内存中同样存在一个内存基址&#xff0c;当我们需要操作这个模块时&#xff0c;通常第一步就是要得到该模块的内存基址&#xff0c;模块分为用户模块和内核模块&#xff0c;这里的用户模块指的是应用层进程运行后…...

聊聊Go语言的注释

文章目录 聊聊Go语言的注释一、注释的格式1.1 块注释1.2 行注释 二、包注释三、命令注释四、类型注释4.1 实例注释4.2 并发安全注释4.3 零值注释4.4 导出字段注释 五、函数注释5.1 参数/返回值/函数作用注释5.2 bool返回值函数注释5.3 形参/返回值名称注释5.4 并发安全注释5.5 …...

皮肤警告,羊大师讲解身体与环境的默契

皮肤警告&#xff0c;羊大师讲解身体与环境的默契 我们常常忽视身体皮肤所承受的压力和警告信号。皮肤是身体的第一道屏障&#xff0c;也是与外界环境直接接触的组织。我们的皮肤通过各种方式向我们传达信息&#xff0c;警告我们关于身体健康的重要问题。本文小编羊大师将带大…...

使用NVM管理多个Nodejs版同时支持vue2、vue3

1.安装nvm,下载地址&#xff1a; https://github.com/coreybutler/nvm-windows/releases/tag/1.1.12 2.nvm常用命令 Usage:nvm arch : Show if node is running in 32 or 64 bit mode.nvm current : Display active version.nvm debug …...

Android帝国之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...