×

ProtoBuf v3 语法简介

96
谢烟客
2017.03.07 18:51* 字数 313

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;
}

1024块
Web note ad 1