ProtoBuf v3 语法简介

syntax

ProtoBuf 有两个语言版本:v2 与 v3,截止目前在使用 v3 的时候,需要在 *.proto 文件首行中明文标识 syntax:

person.proto:

syntax="proto3";

message Person {
    int64 id = 1;
    string name = 2;
}

如果使用的是 v2 ,在首行可以缺省 syntax 标识,或者指定 syntax="proto2"; 都可以:
person.proto:

message Person {
    int64 id = 1;
    string name = 2;
}

v3 与 v2 在语法上有一些区别例如:v3 去除了 optional、required 等,在语法上更为的简洁,我们这里主要介绍 v3,所以对 v2 就不做过多介绍了。

message

message 用来定义一个数据结构

  1. 命名:常规的命名方式建议使用驼峰法,即:HelloWorld 样式
  2. 注释: message 中支持 // 这样的单行注释
  3. repeated 的使用:被 repeated 标识的字段可以理解为是一个数组,示例:
message Person {
    int64 id = 1;
    string name = 2;
    repeated string skills = 3;  // 这里表示 skills 可以接受多个 string 类型的值
}
  1. enum 类型使用:枚举用来表示一定范围内具有相同属性的值,示例:
syntax = "proto3";
message Employee {
    int64 id = 1;
    string name = 2;
    enum Skills {
        GOLANG = 0;
        PYTHON = 1;
        JAVA = 2;
        RUST = 3;
        CPP = 4;
    }
    Skills skill = 3;
}
  1. message 类型的使用: message 在定义过程中是可以声明自己定义的 message 类型,示例:
syntax = "proto3";
message Employee {
    int64 id = 1;
    string name = 2;
    Skill skills = 3;  //这里声明的为自定义的 Skill 类型
}
message Skill {
    string name = 1;
}
  1. map 类型的使用:message 定义时可以使用 map 类型,示例:
syntax = "proto3";
message Employee {
    int64 id = 1;
    string name = 2;
    map<string, Skill> skills = 3;
}
message Skill {
    string name = 1;
}

package

每个 *.proto 文件可以指定 package 作为生成语言的 namespace,示例:

syntax = "proto3";
package exmple;
message Employee {
    int64 id = 1;
    string name = 2;
    map<string, Skill> skills = 3;
}
message Skill {
    string name = 1;
}

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 87,726评论 13 122
  • 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息石头儿和本声明。否则将追究法律责任。ht...
    艾伦噢耶阅读 309评论 1 4
  • 0. 简介 实现了一个可扩展的微型C++序列化框架tiny-serializer。 项目地址:https://gi...
    davidpp阅读 115评论 0 0
  • 由于工程项目中拟采用一种简便高效的数据交换格式,百度了一下发现除了采用 xml、JSON 还有 ProtoBuf(...
    黄海佳阅读 19,255评论 1 13
  • 从今天开始,要改变自己的一些生活习惯了。 古人云,一年之际在于春,一日之际在于晨。很显然,无论是春或者是晨我都做的...
    飘雪于飞阅读 45评论 0 0