protobuf:是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为 profobuf 是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。
创建proto
新建一个pb文件,在pb文件下新建一个test.proto
syntax = "proto3"; //指定版本信息,不指定会报错
package pb; //后期生成go文件的包名
option go_package ="../pb";
//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进行编译,这里需要注意的是一定要在pb的文件下面运行这个代码。(这里如果要使用grpc的话使用这个protoc --go_out=plugins=grpc:. *.proto)
注意上面的这一行 option go_package ="../pb";
这行代码一定要加上去,没有这行代码,会出现报错。
创建main方法
package main
import (
"demo/pb"
"fmt"
"github.com/golang/protobuf/proto"
)
func main() {
person := &pb.Person{
Name: "xiaoraocoding",
Age: 20,
Emails: []string{"xxx@qq.com","demo@qq.com"},
Phones: []*pb.PhoneNumber{
&pb.PhoneNumber{
Type: pb.PhoneType_HOME,
Number: "121212121",
},
&pb.PhoneNumber{
Type: pb.PhoneType_WORK,
Number: "111111",
},
},
}
data,err := proto.Marshal(person) //进行序列化
if err != nil {
fmt.Println("序列化出现错误,err:",err)
}
res_proto := &pb.Person{}
proto.Unmarshal(data,res_proto) //进行反序列化
fmt.Println(res_proto)
}