安装protoc
去到如下网址下载指定的安装包:https://github.com/protocolbuffers/protobuf/releases
配置环境
- 新增一个PROTOBUF_HOME
![](https://img-blog.csdnimg.cn/3e69193878d64478ab1794d6c17e4521.png)
- 在path中配置一下
![](https://img-blog.csdnimg.cn/e4437a4a51b14a599cf5c9714043b4df.png)
安装protoc-gen-go
在cmd窗口执行:
go get -u github.com/golang/protobuf/protoc-gen-go
protoc-gen-go 将自动安装到 $GOPATH/bin 目录下,也需要将这个目录加入到环境变量中。
在cmd窗口执行:
go env
查看GOPATH的目录,再查看是否在bin目录下有protoc-gen-go
若没问题,就配置环境变量(path中):
![](https://img-blog.csdnimg.cn/f698b6ea684342049ee358bca05f866e.png)
使用
-
创建一个proto文件
syntax = "proto3"; //指定版本信息,不指定会报错 option go_package="./;pb"; 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; }
-
执行命令:
protoc --go_out=. *.proto //编译当前目录下的所有proto文件并存放到当前目录下
-
使用编译好的go文件
package main import ( "fmt" "github.com/golang/protobuf/proto" pb "mmo/demoTest/protobuffDemo/pb" ) func main() { //定义一个Person结构对象 person := &pb.Person{ Name: "wuzi", Age: 16, Emails: []string{"sss@qq.com", "dsa15@qq.com"}, Phones: []*pb.PhoneNumber{ &pb.PhoneNumber{ Number: "131254222", Type: pb.PhoneType_MOBILE, }, &pb.PhoneNumber{ Number: "154512451", Type: pb.PhoneType_WORK, }, }, } //将person对象,就是将protobuf中的message进行序列化,得到一个二进制 //data就是传送的数据,对方需要按照Message Person格式进行解析 p, err := proto.Marshal(person) if err != nil { fmt.Println("marshal err:", err) } fmt.Println("编码后的person:", p) //解码 np := new(pb.Person) err = proto.Unmarshal(p, np) if err != nil { fmt.Println("unmarshal err:", err) } fmt.Println("解码后的person:", np) }
输出结果:
编码后的person: [10 4 119 117 122 105 16 16 26 10 115 115 115 64 113 113 46 99 111 109 26 12 100 115 97 49 53 64 113 113 46 99 111 109 34 11 10 9 49 51 49 50 5 3 52 50 50 50 34 13 10 9 49 53 52 53 49 50 52 53 49 16 2] 解码后的person: name:"wuzi" age:16 emails:"sss@qq.com" emails:"dsa15@qq.com" ph ones:{number:"131254222"} phones:{number:"154512451" type:WORK}