protobuf的安装及运行

数据交换格式

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

  1. json: 一般的web项目中,最流行的主要还是 json。因为浏览器对于json 数据支持非常好,有很多内建的函数支持。

  2. xml: 在 webservice 中应用最为广泛,但是相比于 json,它的数据更加冗余,因为需要成对的闭合标签。json 使用了键值对的方式,不仅压缩了一定的数据空间,同时也具有可读性。

  3. protobuf: 是后起之秀,是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为 profobuf 是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。 

  • func Marshal(v interface{}) ([]byte, error)     把V转换为序列化格式
  • func Unmarshal(data []byte, v interface{}) error   Unmarshal函数解析json编码的数据并将结果存入v指向的值。 newdata:=&pb.Person{}

protobuf的优势与劣势

优势:

1:序列化后体积相比Json和XML很小,适合网络传输

2:支持跨平台多语言

3:消息格式升级和兼容性还不错

4:序列化反序列化速度很快,快于Json的处理速度

劣势:

1:应用不够广(相比xml和json)

2:二进制格式导致可读性差

3:缺乏自描述

protobuf环境安装

1.protobuf 编译工具安装

      1、下载 protoBuf:
       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 -h 

2.protobuf 的 go 语言插件安装

于protobuf并没直接支持go语言需要我们手动安装相关插   

         1获取 proto包
         Go语言的proto API接口
          go get  -v -u github.com/golang/protobuf/proto
         go get  -v -u github.com/golang/protobuf/protoc-gen-go

        2编译
          cd $GOPATH/src/github.com/golang/protobuf/protoc-gen-go/
          go build
        3将生成的 protoc-gen-go可执行文件,放在/bin目录下
           sudo cp protoc-gen-go /bin/

基本编译

可以通过定义好的.proto文件来生成go,Java,Python,C++, Ruby, JavaNano, Objective-C,或者C# 代码,需要基于.proto文件运行protocolbuffer编译器protoc。

syntax = "proto3"; 						//指定版本信息,不指定会报错
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;
}

通过如下方式调用protocol编译器:

   protoc --proto_path=IMPORT_PATH --go_out=DST_DIR path/to/file.proto

其中:

  1. --proto_path=IMPORT_PATH,IMPORT_PATH指定了 .proto 文件导包时的路径,如果忽略则默认当前目录。如果有多个目录则可以多次调用--proto_path,它们将会顺序的被访问并执行导入。

  2. --go_out=DST_DIR, 指定了生成的go语言代码文件放入的文件夹

  3. 允许使用 protoc --go_out=./ *.proto 的方式一次性编译多个 .proto 文件

  4. 编译时,protobuf 编译器会把 .proto 文件编译成 .pd.go 文件

简单点 就可以写 protoc  然后就执行下面

我们可以通过以下命令对刚写好的proto文件进行编译

  protoc --go_out=./ *.proto

编译的时候发生了什么?

当用protocol buffer编译器来运行.proto文件时,编译器将生成所选择语言的代码,这些代码可以操作在.proto文件中定义的消息类型,包括获取、设置字段值,将消息序列化到一个输出流中,以及从一个输入流中解析消息。

对go来说,编译器会为每个消息类型生成了一个.pd.go文件。

 

最后使用的时候在另一个文件中使用.

你可能感兴趣的:(golang)