本节介绍,在go语言中,如何是用protobuf对数据进行序列化和反序列化。
1.先参考protobuf快速入门章节安装protoc编译器
2.安装protoc-gen-go
安装针对go语言的编译器插件。
go get -u github.com/golang/protobuf/protoc-gen-go
安装好了之后, 在$GOPATH/bin下面会找到protoc-gen-go,编译器插件,将$GOPATH/bin路径添加到PATH环境变量中。
3.安装protobuf包
使用protobuf需要先安装对应的包。
go get -u github.com/golang/protobuf
4.定义proto消息
例子:
文件名:score_server/score_info.proto
syntax = "proto3";
package score_server;
// 基本的积分消息
message base_score_info_t{
int32 win_count = 1; // 玩家胜局局数
int32 lose_count = 2; // 玩家负局局数
int32 exception_count = 3; // 玩家异常局局数
int32 kill_count = 4; // 总人头数
int32 death_count = 5; // 总死亡数
int32 assist_count = 6; // 总总助攻数
int64 rating = 7; // 评价积分
}
5.编译proto文件,生成go代码
cd score_server
protoc --go_out=. score_info.proto
6.测试代码
package main
import (
"fmt"
// 导入protobuf依赖包
"github.com/golang/protobuf/proto"
// 导入我们刚才生成的go代码所在的包,注意你们自己的项目路径,可能跟本例子不一样
"demo/score_server"
)
func main() {
// 初始化消息
score_info := &score_server.BaseScoreInfoT{}
score_info.WinCount = 10
score_info.LoseCount = 1
score_info.ExceptionCount = 2
score_info.KillCount = 2
score_info.DeathCount = 1
score_info.AssistCount = 3
score_info.Rating = 120
// 以字符串的形式打印消息
fmt.Println(score_info.String())
// encode, 转换成二进制数据
data, err := proto.Marshal(score_info)
if err != nil {
panic(err)
}
// decode, 将二进制数据转换成struct对象
new_score_info := score_server.BaseScoreInfoT{}
err = proto.Unmarshal(data, &new_score_info)
if err != nil {
panic(err)
}
// 以字符串的形式打印消息
fmt.Println(new_score_info.String())
}