一文入门protobuf语法

365 阅读1分钟

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)
}