常用的数据交换格式有三种:
- json: 一般的web项目中,最流行的主要还是 json。因为浏览器对于json 数据支持非常好,有很多内建的函数支持。
- xml: 在 webservice 中应用最为广泛,但是相比于 json,它的数据更加冗余,因为需要成对的闭合标签。json 使用了键值对的方式,不仅压缩了一定的数据空间,同时也具有可读性。
- protobuf: 是后起之秀,是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为 profobuf 是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。
环境配置
编译工具安装
Linxu 安装方法如下:
1、下载 protoBuf:
cd $GOPATH/src/ git clone https://github.com/protocolbuffers/protobuf.git
2、或者直接将压缩包拖入后解压
unzip protobuf.zip
3、安装依赖库
sudo apt-get install autoconf automake libtool curl make g++ unzip libffi-dev -y
4、进入目录
cd protobuf/
5、自动生成configure配置文件:
./autogen.sh
6、配置环境:
./configure
7、编译源代码(时间比较长):
make
8、安装
sudo make install
9、刷新共享库 (很重要的一步啊)
sudo ldconfig
10、测试
protoc —version
MacOS 安装方法:
brew install —build-from-source protobuf
protobuf go 插件安装
获取 proto包(Go语言的proto API接口):
go get -v -u github.com/golang/protobuf/proto
go get -v -u github.com/golang/protobuf/protoc-gen-go
使用方法
例1:
syntax = "proto3"; // 指定版本信息,不指定会报错
package pb;
option go_package ="../pb"; // 后期生成go文件的包名
// message为关键字,作用为定义一种消息类型,变量后的数字表示序列化时的顺序
message Person {
string name = 1; // 姓名
int32 age = 2; // 年龄
repeated string emails = 3; // 电子邮件(repeated表示字段允许重复)
repeated PhoneNumber phones = 4; // 手机号
}
// enum为关键字,作用为定义一种枚举类型
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
// message为关键字,作用为定义一种消息类型可以被另外的消息类型嵌套使用
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
与 go 对应的数据类型
proto Type | Go Type | Notes |
---|---|---|
double | float64 | 64位浮点数 |
float | float32 | 32位浮点数 |
int32 | int32 | 使用变长编码,对负值的效率低,如果你的域有可能有负值,请使用sint64替代 |
uint32 | uint32 | 使用变长编码 |
uint64 | uint64 | 使用变长编码 |
sint32 | int32 | 使用变长编码,这些编码在负值时比int32高效的多 |
sint64 | int64 | 使用变长编码,有符号的整型值。编码时比通常的int64高效。 |
fixed32 | uint32 | 总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。 |
fixed64 | uint64 | 总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。 |
sfixed32 | int32 | 总是4个字节 |
sfixed32 | int32 | 总是4个字节 |
sfixed64 | int64 | 总是8个字节 |
bool | bool | |
string | string | 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。 |
bytes | []byte | 可能包含任意顺序的字节数据。 |
编译为 .go 文件
标准语法:protoc --proto_path=IMPORT_PATH --go_out=DST_DIR path/to/file.proto
以例1为例:
执行:--go_out=./ *.proto
后,生成一个 person.pb.go 文件。