美文网首页
protobuf3使用,golang语言实现

protobuf3使用,golang语言实现

作者: 清泉_QingQuan | 来源:发表于2018-11-02 17:09 被阅读0次

    1.安装protobuf3版本

    下载安装protobuf-3.1.0版本, 把 F:\Program Files\protoc-3.3.0-win32\bin\protoc.exe 文件路径添加到环境变量中。

    查看是否安装成功,在命令行输入: proto --version

    安装成功之后,就可以按照protobuf的规则编码和解码任何我们想要传输的数据了。

    比起xml和json形式的数据传输,protobuf拥有更高的数据压缩比和压缩效率。

    2.写test.proto文件

    相当于给一个对象添加相应的属性。

    //指定版本
    //注意proto3与proto2的写法有些不同
    syntax = "proto3";
    
    //包名,通过protoc生成时go文件时
    package test;
    
    // 班级
    message Class {
        int32 num = 1;
        repeated Student students = 2;
    }
    
    // 学生
    message Student {
        string name = 1;
        int32 age = 2;
        Sex sex = 3;
    }
    
    //性别
    enum Sex {
        MAN = 0;
        WOMAN = 1;
    }
    

    3.生成文件test.pb.go文件

    .proto文件写好之后,不方便我们在代码中使用,需要利用刚才安装的proto工具生成一个我们可以在代码中方便实际调用的类。

    这个类生成之后就变成我们和protobuf交换数据的桥梁,我们可以看懂和使用,protobuf也可以识别和解析。

    生成test.pb.go文件之后.proto就不需要了,但是为了后期更改和代码可读性继续保留该文件。

    test.pb.go具体代码我就不贴出来了,命令如下: protoc --go_out=. *.proto

    4.测试和验证

    package main
    
    import (
        "github.com/goinaction/learning/proto3-my/test"
        "github.com/gogo/protobuf/proto"
        "io/ioutil"
        "os"
        "log"
    )
    
    func write() {
        c1 := &test.Class{
            Num: 1,
            Students: []*test.Student{
                {Name: "xiaoming", Age: 21, Sex: test.Sex_MAN},
                {Name: "xiaohua", Age: 21, Sex: test.Sex_WOMAN},
                {Name: "xiaojin", Age: 21, Sex: test.Sex_MAN},
            },
        }
    
        // 使用protobuf工具把struct数据类型格式化成字节数组(压缩和编码)
        data, _ := proto.Marshal(c1)
    
        // 把字节数组写入到文件中
        ioutil.WriteFile("test.txt", data, os.ModePerm)
    }
    
    func read() {
        // 以字节数组的形式读取文件内容
        data, _ := ioutil.ReadFile("test.txt")
    
        class := new(test.Class)
    
        // 使用protobuf工具把字节数组解码成struct(解码)
        proto.Unmarshal(data, class)
    
        log.Println(class.Num)
        for _, v := range class.Students {
            log.Println(v.Name, v.Age, v.Sex)
        }
    }
    
    func main() {
        write()
        read()
    }
    
    

    代码输出结果:

    2018/11/02 16:18:52 1
    2018/11/02 16:18:52 xiaoming 21 MAN
    2018/11/02 16:18:52 xiaohua 21 WOMAN
    2018/11/02 16:18:52 xiaojin 21 MAN
    

    相关文章

      网友评论

          本文标题:protobuf3使用,golang语言实现

          本文链接:https://www.haomeiwen.com/subject/sfhcxqtx.html