> 各服务端之间的通讯经常会用到protobuf,因为它比json这些更加的快速高效
[TOC]
## 安装编译器
### 安装protoc编译器
> 可在https://github.com/protocolbuffers/protobuf/releases 下载最新安装包
~~~
// 请自行将zip转换成tar.gz
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protoc-3.11.2-linux-x86_64.zip
tar zxvf protoc-3.11.2-linux-x86_64.tar.gz
~~~
> 配置环境变量
~~~
vim ~/.bash_profile
// 将/opt/protoc/bin加入到环境变量中
// 将go 安装的bin插件配置到环境变量中,可通过go env查看GOPATH=/root/go/,如 /root/go/bin
// 如 PATH=$PATH:$HOME/bin:/opt/protoc/bin:/opt/go/bin:/root/go/bin
source ~/.bash_profile
~~~
### go 安装编译器插件
> 此处go的安装步骤过滤,可参考go的安装篇
> 安装执行可以安装go的国内镜像,这样安装插件更加快速稳定
~~~
# 启用 Go Modules 功能
go env -w GO111MODULE=on
# 配置镜像
go env -w GOPROXY=https://goproxy.cn
# 查看是否生效
go env | grep GOPROXY
~~~
> 安装编译器插件
~~~
go get -u github.com/golang/protobuf/protoc-gen-go
~~~
## 创建pb测试文件 (test.proto)
> 头部需指定是proto2还是proto3,有些第三方提供的是没有包含,需要显示指定
> vim /opt/pbtest/test.proto
~~~
//syntax = "proto2";
syntax = "proto3";
package myapi;
// 字段都是用1,2,3这样的方式进行索引标识,等转换成PHP的类的时候,通过getXXFiled()的时候,则是根据这个索引标识进行获取
message Person {
int32 id = 1;
string name = 2;
string email = 3;
double money = 4;
bool is_rich = 5;
}
message player_login {
int32 user_id = 1;
string token = 2;
};
~~~
> 当前目录执行:`protoc --go_out=. *.proto`即可生成对应的go执行文件
## 进行代码测试
~~~
package main
import (
"fmt"
"github.com/golang/protobuf/proto"
"websocket_test/myapi"
)
func main() {
person := &myapi.Person{}
person.Id = 112
person.Name = "www"
person.Email = "www@qq.com"
person.Money = 11
person.IsRich = true
fmt.Println("Students信息为:",person)
// 序列化
buffer, _ := proto.Marshal(person)
fmt.Println("序列化之后的信息为:",buffer)
// 反序列化
data:=&myapi.Person{}
proto.Unmarshal(buffer,data)
fmt.Println("反序列化之后的信息为:",data)
}
~~~



