七叶笔记 » golang编程 » protobuf多平台使用

protobuf多平台使用

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于 通讯协议 、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

Protocol Buffers 是一种语言中立、平台中立的可扩展机制,用于序列化结构化数据。

protobuf 定义

 syntax = "proto3"; // 定义proto的版本

package xxx; // 定义proto的包名,包名可以避免对message 类型之间的名字冲突,同名的Message可以通过 package 进行区分。

import "google/protobuf/any.proto"; //引入其它proto文件

option go_package = "xxx"; // 指定生成的 go 文件package



// 同一个message的每个字段都有唯一一个编号,并且建议终生这个编号都不要改变。
message AllNormalypes {
  // 数字类型: double、 float 、int32、int64、uint32、uint64、sint32、sint64: 存储长度可变的浮点数、整数、无符号整数和有符号整数
    double field1 = 1;  
    float field2 = 2;
    int32 field3 = 3;
    int64 field4 = 4;
    uint32 field5 = 5;
    uint64 field6 = 6;
    sint32 field7 = 7;
    sint64 field8 = 8;
  // 存储固定大小的数字类型:fixed32、fixed64、sfixed32、sfixed64: 存储空间固定
    fixed32 field9 = 9;
    fixed64 field10 = 10;
    sfixed32 field11 = 11;
    sfixed64 field12 = 12;
  //  布尔 类型:  bool 
    bool field13 = 13;
  //  字符串 : string
    string field14 = 14;
  // bytes: 字节数组
    bytes field15 = 15;
}


message Unnormalypes {
    // oneOf 如果你有一组字段,同时最多允许这一组中的一个字段出现,就可以使用Oneof定义这一组字段,这有点Union的意思,但是Oneof允许你设置零各值。
    oneof field1 {
        string filed2 = 1;
        int64 filed3 = 2;
    }
    // map类型需要设置键和值的类型,格式是"map" "<" keyType ","  TYPE  ">" mapName "=" fieldNumber [ "[" fieldOptions "]"。
    map<int32, string > filed4 = 4;

    //枚举类型
    enum  file d5 {
        TYPE_UNKNOWN = 0; //第一个枚举值必须是0,而且必须定义。
        TYPE_A = 1;
        TYPE_B = 2;
    }

    //Any字段允许你处理嵌套数据,并不需要它的proto定义。一个Any以 bytes 呈现序列化的消息,并且包含一个URL作为这个类型的唯一标识和元数据。
    //为了使用Any类型,你需要引入google/protobuf/any.proto。
    google.protobuf.Any filed6 = 6;
}   

除了上面这些类型外还有 repeated 修饰符,代表可重复(可以理解为数组)

proto 类型与其他部分语言的类型对照

.proto Type

java /Kotlin Type

Go Type

PHP Type

double

double

float64

float

float

float

float32

float

int32

int

int32

integer

int64

long

int64

integer/string

uint32

int

uint32

integer

uint64

long

uint64

integer/string

sint32

int

int32

integer

sint64

long

int64

integer/string

fixed32

int

uint32

integer

fixed64

long

uint64

integer/string

sfixed32

int

int32

integer

sfixed64

long

int64

integer/string

bool

boolean

bool

boolean

string

String

string

string

bytes

byte String

[]byte

string

生成对应语言的结构体

 # 生成php文件
protoc --php_out=./php -I ./google --grpc_out=generate_server:./php --proto_path=./proto --plugin=protoc-gen-grpc=/usr/bin/grpc_php_plugin ./*.proto
// 生成golang文件
protoc --go_out=./golang -I ./google --go-grpc_out=./golang --proto_path=./proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative ./*.proto
// 生成java 文件
protoc --go_out=./java -I ./google --java_out=./java --proto_path=./proto  ./*.proto  

相关文章