介绍文档:proto 文件的关键字介绍

简介: 介绍文档:proto 文件的关键字介绍

引言

使用proto文件的时候,会遇到一个问题,不知道proto文件中都有哪些关键字,我在这里做了集中整理,方柏霓后续人员学习时查阅。以下是详细内容。

关键字介绍

proto文件是Google Protocol Buffers的定义文件,用于定义数据结构和消息格式。以下是proto文件中常用的关键字:

  1. syntax:指定proto文件使用的语法版本。
  2. package:指定生成的代码所在的包名。
  3. import:导入其他proto文件。
  4. option:设置特定的选项。
  5. message:定义消息类型。
  6. enum:定义枚举类型。
  7. service:定义服务接口。
  8. rpc:定义远程过程调用方法。
  9. oneof:定义互斥字段,只能选择其中一个字段。
  10. map:定义映射类型,类似于字典。
  11. repeated:定义重复字段,可以有多个值。
  12. required:定义必需字段,必须有值。
  13. optional:定义可选字段,可以有值也可以为空。
  14. extensions:定义扩展字段。
  15. extend:扩展已有的消息类型或枚举类型。

关键字使用介绍

好的,以下是每个关键字的使用示例:

  1. syntax:
syntax = "proto3";
  1. package:
package mypackage;
  1. import:
import "google/protobuf/timestamp.proto";
  1. option:
option java_package = "com.example.mypackage";


  1. message:
message Person {
 string name = 1;
  int32 age = 2;
   repeated string phone_numbers = 3;
}
  1. enum:
enum PhoneType {
  MOBILE = 0;
   HOME = 1;
  WORK = 2;
}


  1. service:
service MyService {
  rpc GetData (GetDataRequest) returns (GetDataResponse);
}


  1. rpc:
rpc GetData (GetDataRequest) returns (GetDataResponse);


  1. oneof:
message Person {
  string name = 1;
  oneof phone_number {
    string mobile = 2;
    string home = 3;
    string work = 4;
      }
}



  1. map:
message Person {
  string name = 1;
  map<string, string> phone_numbers = 2;
}


  1. repeated:
message Person {
  string name = 1;
  repeated string phone_numbers = 2;
}
  1. required:
message Person {
  required string name = 1;
  required int32 age = 2;
}


  1. optional:
message Person {
  optional string name = 1;
  optional int32 age = 2;
}


  1. extensions:
extend Person {
  extensions 100 to 199;
  optional string email_address = 100;
}


  1. extend:
extend google.protobuf.Timestamp {
  optional string timezone = 1000;
}

嵌套使用示例

下面是一些示例,展示了proto文件中的嵌套、数组和以结构体为值的映射的用法:


  1. 嵌套示例:
syntax = "proto3";

message Address {
  string street = 1;
  string city = 2;
  string state = 3;
}

message Person {
  string name = 1;
  int32 age = 2;
  Address address = 3;
}

在上面的示例中,Address是一个嵌套在Person中的消息类型。

  1. 数组示例:
syntax = "proto3";

message Person {
  string name = 1;
  repeated string phone_numbers = 2;
}

在上面的示例中,phone_numbers字段是一个字符串数组。

  1. 以结构体为值的映射示例:
syntax = "proto3";

message Person {
  string name = 1;
  map<string, Address> addresses = 2;
}

message Address {
  string street = 1;
  string city = 2;
  string state = 3;
}


在上面的示例中,addresses字段是一个以字符串为键、Address结构体为值的映射。

这些示例展示了如何在proto文件中使用嵌套、数组和以结构体为值的映射,你可以根据自己的需求进行相应的定义和使用。


除了嵌套、数组和以结构体为值的映射之外,还有一些其他复杂的用法可以在proto文件中使用。以下是一些示例:

  1. 自定义枚举值:
syntax = "proto3";

enum PhoneType {
  MOBILE = 0;
  HOME = 1;
  WORK = 2;
  CUSTOM = 3;
}

在上面的示例中,我们定义了一个自定义的枚举值CUSTOM。


  1. 扩展字段:
syntax = "proto3";

message Person {
  string name = 1;
  extensions 100 to 199;
}

extend Person {
  optional string email = 100;
}

在上面的示例中,我们使用extend关键字扩展了Person消息类型,添加了一个可选的email字段。

  1. 服务定义和RPC方法:
syntax = "proto3";

service MyService {
  rpc GetData (GetDataRequest) returns (GetDataResponse);
  rpc UpdateData (UpdateDataRequest) returns (UpdateDataResponse);
}

message GetDataRequest {
  string id = 1;
}

message GetDataResponse {
  string data = 1;
}

message UpdateDataRequest {
  string id = 1;
  string newData = 2;
}

message UpdateDataResponse {
  bool success = 1;
}

在上面的示例中,我们定义了一个名为MyService的服务,其中包含了两个RPC方法:GetData和UpdateData。每个RPC方法都有对应的请求消息和响应消息。

这些示例展示了一些复杂的用法,你可以根据自己的需求在proto文件中进行定义和使用。

分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za


目录
相关文章
|
9月前
|
算法 开发者
【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义
【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义
219 0
|
4月前
|
Java 编译器
“公共类 XXX 应该在文件中出现”错误怎么查找解决
要解决“公共类XXX应该在文件中出现”的错误,首先定位报错的类名及文件,确认类声明是否为公共(public)。若问题未解,需检查文件命名与类名是否一致,及文件路径是否正确。确保这些要素正确无误可解决此问题。
83 12
|
8月前
|
Rust 编译器
Rust中的模块路径和pub关键字详解
Rust中的模块路径和pub关键字详解
|
9月前
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
663 0
|
9月前
|
安全 程序员 编译器
【C/C++ 常用关键字使用指南】C++ 关键字 在头文件和源文件中函数声明与定义使用上的差异
【C/C++ 常用关键字使用指南】C++ 关键字 在头文件和源文件中函数声明与定义使用上的差异
241 0
|
9月前
|
存储 Oracle Java
【JavaSE】注释\标识符\关键字\字面常量\数据类型与变量
【JavaSE】注释\标识符\关键字\字面常量\数据类型与变量
51 0
|
缓存 JavaScript 前端开发
用 @types 前缀的包是什么?有什么用?
解决过 TypeScript 的项目大概都是从两个方向,Vue3 方向和 React Native 方向,而在 React Native 方向上我经常会遇到一个烦人的错误,这个问题的场景通常出现于 t
|
算法 C++ Python
师父给了我一个 .proto 文件,我应该怎么使用?
师父给了我一个 .proto 文件,我应该怎么使用?
185 0
|
PHP 开发者
嵌套文件包含路径问题|学习笔记
快速学习嵌套文件包含路径问题
嵌套文件包含路径问题|学习笔记
|
存储 Java Linux
知识分享之Golang——Bleve中如何定义一个自定义文档映射对象
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
127 0
知识分享之Golang——Bleve中如何定义一个自定义文档映射对象