go中使用protobuf


安装protoc

去到如下网址下载指定的安装包:https://github.com/protocolbuffers/protobuf/releases


配置环境

  1. 新增一个PROTOBUF_HOME
  1. 在path中配置一下

安装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中):


使用

  1. 创建一个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;
    }
    
  2. 执行命令:

    protoc --go_out=. *.proto  //编译当前目录下的所有proto文件并存放到当前目录下
    
  3. 使用编译好的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}
    
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值