常用的数据交换格式有三种:

  1. json: 一般的web项目中,最流行的主要还是 json。因为浏览器对于json 数据支持非常好,有很多内建的函数支持。
  2. xml: 在 webservice 中应用最为广泛,但是相比于 json,它的数据更加冗余,因为需要成对的闭合标签。json 使用了键值对的方式,不仅压缩了一定的数据空间,同时也具有可读性。
  3. 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:

  1. syntax = "proto3"; // 指定版本信息,不指定会报错
  2. package pb;
  3. option go_package ="../pb"; // 后期生成go文件的包名
  4. // message为关键字,作用为定义一种消息类型,变量后的数字表示序列化时的顺序
  5. message Person {
  6. string name = 1; // 姓名
  7. int32 age = 2; // 年龄
  8. repeated string emails = 3; // 电子邮件(repeated表示字段允许重复)
  9. repeated PhoneNumber phones = 4; // 手机号
  10. }
  11. // enum为关键字,作用为定义一种枚举类型
  12. enum PhoneType {
  13. MOBILE = 0;
  14. HOME = 1;
  15. WORK = 2;
  16. }
  17. // message为关键字,作用为定义一种消息类型可以被另外的消息类型嵌套使用
  18. message PhoneNumber {
  19. string number = 1;
  20. PhoneType type = 2;
  21. }

与 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 文件。

参考资料

  1. https://www.kancloud.cn/aceld/zinx/1960265