Protobuf

ProtoBuf是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。是谷歌的亲儿子

自定义数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义版本
syntax="proto3";
package Main;
// 这个不加在命令行编译会报错,提示你必须指明package
option go_package = "./";

// 定义结构体
message Student{
string name = 1;
required bool male = 2;
repeated int32 scores = 3; //这里相当于定义了一个int类型的数组
optional hobby = 4;
reserved 2, 15, 9 to 11; // 保留2,15,9到11这些标识号给下次用,如果用了的话,编译器会警告
}

对于前面的约束,

  • required: 有且只能出现一次
  • optional: 0次或1次
  • repeated: 任意次,相当于定义了一个数组类型

! 注意后面的序号是必须且唯一的,相当于字段的唯一ID

再通过命令 protoc --go_out=. test.proto 则会在当前目录下生成 test.pb.go 文件。

map 类型

map<key_type, value_type> map_field = N;

注意map 前面不能用repeated修饰,且key_type不能是浮点数(精度舍入),enum等类型。

分割线——————————————————

定义枚举消息类型,来满足在某个字段可能为某些预定义值中的一个:

1
2
3
4
5
6
7
8

enum PhoneType //枚举消息类型,使用enum关键词定义,一个电话类型的枚举类型
{
MOBILE = 0; //proto3版本中,首成员必须为0,成员不应有相同的值
HOME = 1;
WORK = 2;
}

嵌套

可以在消息中引用其它消息定义类型,也可以在一个消息中嵌套定义一个消息(message-> message。

对于引用其它proto包里面的消息类型。只需 import "other.proto"

使用

  • 最后我们可以通过proto提供的与结构体之间的序列化与反序列化(即 Marshal()/Unmarshal() )方法来相互转换。